我有一个包含行的.txt,这些行依次用“,”分隔数据,例如:
10,05,nov,2016,122,2,2,330,user
我想要的是能够修改X行的参数,搜索方法是第一个唯一的数字,不会重复。
例如,找到数字10(f1)并修改包含122(f5)的行。
我已经用sed
尝试了但我不能这样做。
我已经评论过awk
我可以,但我没有研究过那个命令。
一些帮助??
答案 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
引用find
,f
引用field
,n
引用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
开头的行中,搜索第四个逗号,后跟非逗号字符,并替换为替换字符串。