更新分隔行中的第 n 个元素 [unix 脚本]

Posted

技术标签:

【中文标题】更新分隔行中的第 n 个元素 [unix 脚本]【英文标题】:Update nth element in delimited line [unix scripting] 【发布时间】:2021-12-17 16:10:44 【问题描述】:

我有一个包含逗号分隔行的 .temp 文件:

abc,1,000,aaa,zzz,2,234,OOO,00001,01,123,214
def,2,003,bbb,yyy,4,345,PPP,00002,02,133,224
ghi,3,011,ccc,xxx,6,456,QQQ,00003,03,143,234
jkl,4,012,ddd,www,8,567,RRR,00004,04,153,244
...

每行被读取,第 3 列用于更新第 9 列

我可以这样做:

indexToUpdate=9

updatedLine="$(echo "$line" | sed "s/[^,]*/$new9thColumnData/$indexToUpdate")"

我的问题是,除了使用 sed 之外,还有更快的方法来更新第 9 列数据吗?

【问题讨论】:

有很多方法可以实现(想到剪切和粘贴)但是这个用第三列替换第 9 列的 GNU sed 解决方案可能会有所帮助 - sed -E 's/(([^,]*,)3([^,]*,)5)[^,]*,/\1\2/' file 【参考方案1】:

除了 potong 的 suggestion,您还可以使用例如awk:

awk -F ',' ' OFS=FS; $9=$3; print ' file

【讨论】:

【参考方案2】:

perl -lanF, -e 'print join ",", @F[0..7,2,9..$#F]' file

或者,像上面的 awk:

perl -lanF, -e '$F[8]=$F[2]; print join ",", @F' file

使用 perl 的自动拆分以逗号分隔,从而创建 @F 数组,然后以不同的顺序打印。

并不是说 perl 比 sed 或 awk 快...

【讨论】:

以上是关于更新分隔行中的第 n 个元素 [unix 脚本]的主要内容,如果未能解决你的问题,请参考以下文章

最大子矩阵和 题解

sed:查找并替换以特定字符串开头的行中的第 n 个字符

最大子矩阵(信息学奥赛一本通 1224)

在 Python 中查找逗号分隔列表中的第 N 个项目

awk

MATLAB 索引问题