在bash中修改.txt文件中的行

时间:2016-11-16 13:24:11

标签: bash awk sed

我有一个包含行的.txt,这些行依次用“,”分隔数据,例如:

10,05,nov,2016,122,2,2,330,user

我想要的是能够修改X行的参数,搜索方法是第一个唯一的数字,不会重复。 例如,找到数字10(f1)并修改包含122(f5)的行。 我已经用sed尝试了但我不能这样做。 我已经评论过awk我可以,但我没有研究过那个命令。 一些帮助??

2 个答案:

答案 0 :(得分:1)

如下所示的简单awk脚本应该可以解决这个问题:

awk -v find="10" -v field="5" -v newval="abcd" 'BEGIN {FS=OFS=","} {if ($1 == find) $field=newval; print $0}' test.csv

说明:

  • awk -v find="10" -v field="5" -v newval="abcd":为awk定义了3个变量。 find,其中包含我们要查找的模式,field包含我们要编辑的字段的编号,newval包含要替换的值。
  • BEGIN {FS=OFS=","}:在遍历文件之前,我们将文件分隔符和输出文件分隔符设置为","。
  • if ($1 == find) $field=newval:如果一行的第一个字段包含我们想要的模式,我们将第N个字段(第一个$field=1,第二个$field=2,...)设置为价值newval
  • print $0:无论if测试的结果如何,我们都打印整行。

此脚本的较短(但不易理解)版本可编写如下:

awk -v a="10" -v f="5" -v n="abcd" -F, '$1 == a {$f=n}OFS=FS' test.csv

a引用findf引用fieldn引用newval-F,引用FS=","

脚本在行动:

> cat test.csv
11,05,nov,2016,122,2,2,330,user
10,05,nov,2016,123,2,2,330,user
12,05,nov,2016,124,2,2,330,user

> awk -v find="10" -v field="5" -v newval="abcd" 'BEGIN {FS=OFS=","} {if ($1 == find) $field=newval; print $0}' test.csv
11,05,nov,2016,122,2,2,330,user
10,05,nov,2016,abcd,2,2,330,user
12,05,nov,2016,124,2,2,330,user

答案 1 :(得分:0)

使用sed:

$ sed '/^10/s/,[^,]*/,333/4' <<< "10,05,nov,2016,122,2,2,330,user"
10,05,nov,2016,333,2,2,330,user

在以10开头的行中,搜索第四个逗号,后跟非逗号字符,并替换为替换字符串。