如何替换列的值并将输出存储到同一个文件中?
示例输入,文件:
#car|year|model
toyota|1998|corrola
toyota|2006|yaris
opel|2001|corsa
将“corrola”替换为“corrolacoupe” 并将其存储到输入文件
#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
答案 0 :(得分:0)
只需将(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
答案 1 :(得分:0)
在没有任何临时文件的情况下就地修改文件的ed
解决方案可能类似于:
ed "$FILE" <<< $',s/|corrola$/|corrolacoupe/g\nw'
使用ANSI-C字符串来防止特殊字符被处理,然后在任何行的末尾匹配|corrola
并用|corrolacoupe
替换它。然后我们向w
发出ed
命令,让它将文件写回
答案 2 :(得分:0)
一个非常简单的解决方案。
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$