如何替换列的值并将输出存储到同一个文件中?
示例输入,文件:
#car|year|model
toyota|1998|corrola
toyota|2006|yaris
opel|2001|corsa
将"科罗拉"改为"科罗拉库佩"并将其存储到输入文件中
#car|year|model
toyota|1998|corrolacoupe
toyota|2006|yaris
opel|2001|corsa
我试过这个
awk -F '|' -v col=$column -v val=$value '/^[^#]/ FNR==NR {print $col = val }' OFS='|' $FILE >> $FILE
(row,col)
中的值替换为新值:
$ awk -F'|' -v OFS='|' -v row=2 -v col=3 -v val=corollacoupe 'NR==row {$col=val} 1' file
#car|year|model
toyota|1998|corollacoupe
toyota|2006|yaris
opel|2001|corsa
这会将输入字段col
的值设置为 val
,但仅在输入记录row
中。最后1
将确保默认打印每条记录。输入和输出字段分隔符通过-F
选项和OFS
变量进行设置。
如果需要就地进行这些更改,请创建一个临时输出文件,然后将其复制到原始文件上:
$ awk ... file >file.tmp && cp file{.tmp,}
或者,在 GNU awk
中,您可以通过以下选项使用 inplace
库-i inplace
:
$ awk -i inplace -F'|' -v OFS='|' -v row=2 -v col=3 -v val=corollacoupe 'NR==row {$col=val} 1' file
如果您希望跳过评论,只计算非评论行:
$ awk -F'|' -v OFS='|' -v row=1 -v col=3 -v val=x '/^[^#]/ {nr++} nr==row {$col=val} 1' file
#car|year|model
toyota|1998|x
toyota|2006|yaris
opel|2001|corsa
没有任何临时文件的情况下就地修改文件的ed
解决方案可能是这样的:
ed "$FILE" <<< $',s/|corrola$/|corrolacoupe/gnw'
它使用 ANSI-C 字符串来防止特殊字符被特殊处理,然后在任何行的末尾匹配|corrola
并将其替换为 |corrolacoupe
。 然后我们发出 w
命令ed
让它将文件写回
一个非常简单的解决方案。
darby@Debian:~/Scrivania$ cat file
#car|year|model
toyota|1998|corrola
toyota|2006|yaris
opel|2001|corsa
darby@Debian:~/Scrivania$ sed -ri 's@^(.+)|(.+)|corrola$@1|2|corrolacoupe@' file
darby@Debian:~/Scrivania$ cat file
#car|year|model
toyota|1998|corrolacoupe
toyota|2006|yaris
opel|2001|corsa
darby@Debian:~/Scrivania$