更改字段而不更改$ 0

时间:2017-04-19 16:02:47

标签: awk field separator

在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

1 个答案:

答案 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,其中包含简洁,可测试的样本输入和预期输出,那么您可以获得更多帮助。