Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中修改.txt文件中的行_Bash_Awk_Sed - Fatal编程技术网

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

在bash中修改.txt文件中的行,bash,awk,sed,Bash,Awk,Sed,我有一个.txt文件,其中包含行,这些行依次用“,”分隔,例如: 10,05,nov,2016,122,2,2,330,user 我想要的是能够修改X线的参数,搜索方法是第一个数字,它是唯一的,不会重复。 例如,查找数字10(f1)并修改包含122(f5)的行。 我用sed试过了,但做不到。 我评论说,使用awk我可以,但我没有研究这个命令。 一些帮助???一个简单的awk脚本,如以下所示,应该可以做到这一点: awk -v find="10" -v field="5" -v newval="

我有一个.txt文件,其中包含行,这些行依次用“,”分隔,例如:

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

一个简单的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个变量<代码>查找,其中包含我们正在查找的模式,
    字段
    ,其中包含我们要编辑的字段的编号,以及带有要替换的值的
    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
字段
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
对于sed:

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

$sed'/^10/s/,[^,]*/,333/4'请将该示例输入的所需输出添加到您的问题中。欢迎使用堆栈溢出!请出示你的问题。你应该包括一个你有问题的代码,然后我们可以尝试帮助解决具体的问题。你也应该阅读。