我正在对一个文件应用 awk 命令,但该文件没有修改。有人能解释为什么会发生这种情况吗?
awk 'BEGIN{FS=OFS=""}; {if($692=="6") sub($690,"9");print $0;}' abc.txt >efg.txt
注意:每行大约有1000个字符。
答案1
怎么了
关键问题是您使用sub()
不当。sub()
应该根据模式匹配进行替换(这是最重要的部分!)。正确的语法是:
sub(regular_expression,replacement,substring)
您正在做的事情是sub($692,"9")
,所以您告诉它替换您在字段编号 692 中看到的相同内容的第一次出现,但该第一次出现可能在该行的前面很远的地方。
以下是一个例子:
$ echo "1253456" | awk 'BEGIN{FS=OFS=""};{if($4==3) sub($6,"@");print}'
12@3456
这实际上是获取第 6 个字段(即数字 5)中的所有内容,并删除该内容的第一次出现。与您的命令执行的操作相同。
应该怎么做
要替换特定字段,您不需要sub()
,只需直接分配给该字段。
awk 'BEGIN{FS=OFS=""}; {if($692==6) $690="9";print}' abc.txt >efg.txt
请注意,我还删除了$0
,print
因为调用print
本身已经默认$0
假设