在AWK中分配任何字段时,将重新计算$0
,并使用输出字段分隔符(OFS
)替换原始字段分隔符。但是当我更改字段时,我希望$0
中的字段分隔符保持不变。我的输入字段分隔符(FS
)是一个正则表达式,因此只需使输出文件分隔符与输入文件分隔符相同即可。
有没有办法在不更改$0
中的字段分隔符的情况下更改字段?
编辑:
我的输入字段分隔符为FS = "([^[:digit:]\\.,]|^)+0*[\\.,]?0*";
。
我的脚本检查等号左侧的数字,并相应地更改每行输入的右侧数字(确切地说,它找到并更正有效数字的数量)。例如,给定输入
50g * 10 = 500g
0.030L+1.12L=1.150L
我的脚本应该输出
50g * 10 = 50E+1g
0.030L+1.12L=1.2L
,但是由于我更改了原始字段分隔符,因为我更改了等号右侧的数字字段,而是输出
50 10 50E+1
30 1.12 1.2
答案 0 :(得分:2)
我不明白你的问题的细节,但是在不改变字段分隔符的情况下更改字段,你在整个记录中使用正则表达式。看:
$ echo 'a;b;c;d' | awk -F';' '{$3="X"}1'
a b X d
$ echo 'a;b;c;d' | awk 'match($0,/^([^;]*;){2}/){head=substr($0,RSTART,RLENGTH); tail=substr($0,RSTART+RLENGTH); sub(/^[^;]*/,"",tail); $0 = head "X" tail } 1'
a;b;X;d
是的,这是更多的代码,但它可以在不将FS更改为OFS的情况下进行字符串替换。使用GNU awk可以更简洁地完成它,但是因为你想要POSIX ......
如果你的FS不能被否定的另一种选择是带有match()+ substr()的循环。
如果您编辑问题以包含mcve,其中包含简洁,可测试的样本输入和预期输出,那么您可以获得更多帮助。