Awk 更改字段而不更改$0中的字段分隔符
在AWK中分配任何字段时,将重新计算Awk 更改字段而不更改$0中的字段分隔符,awk,field,separator,Awk,Field,Separator,在AWK中分配任何字段时,将重新计算$0,并用输出字段分隔符(OFS)替换原始字段分隔符。但是我希望在更改字段时,$0中的字段分隔符保持不变。我的输入字段分隔符(FS)是一个正则表达式,因此简单地使输出文件分隔符与输入文件分隔符相同是不行的 在$0中,是否有任何方法可以在不更改字段分隔符的情况下更改字段 编辑: 我的输入字段分隔符是FS=“([^[:digit:][\\,][124;^)+0*[\\,][0*”。 我的脚本检查等号左侧的数字,并针对每行输入相应地更改右侧的数字(确切地说,它查找并
$0
,并用输出字段分隔符(OFS
)替换原始字段分隔符。但是我希望在更改字段时,$0
中的字段分隔符保持不变。我的输入字段分隔符(FS
)是一个正则表达式,因此简单地使输出文件分隔符与输入文件分隔符相同是不行的
在$0
中,是否有任何方法可以在不更改字段分隔符的情况下更改字段
编辑:
我的输入字段分隔符是FS=“([^[:digit:][\\,][124;^)+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
我不理解你问题的细节,但要在不更改字段分隔符的情况下更改字段,需要在整个记录上使用regexp。看:
$ 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()的循环
如果您将问题编辑为包含简洁、可测试的示例输入和预期输出,则您可以获得更多帮助。我不了解您问题的详细信息,但要在不更改字段分隔符的情况下更改字段,您可以在整条记录上使用regexp。看:
$ 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()的循环
如果您将问题编辑为包含简洁、可测试的示例输入和预期输出,则您可以获得更多帮助。提供输入示例,让我们知道您希望它如何工作。tmp=$0;分(/…/,“&”,tmp)$0=tmp
?或GNU awk拆分($0,arr,FS,seps)
且分离器在seps中是否安全?未测试,因为您没有提供任何示例数据。@Inian,我添加了示例输入以及相应输出的外观与实际外观。我是否也应该发布脚本本身?(~30行)发布一个简短的脚本,演示您请求帮助的问题。我们不需要查看遇到此问题时正在运行的任何较大的脚本。只需发布一篇演示此问题的文章。@JamesBrown gawk拆分似乎满足了我的要求,但我宁愿保持它与POSIX兼容。我想我可以使用sub来查找原始数字并用脚本生成的数字替换,但是处理重复的数字会有点麻烦。请提供一个输入示例,让我们知道您希望它如何工作。tmp=$0;分(/…/,“&”,tmp)$0=tmp
?或GNU awk拆分($0,arr,FS,seps)
且分离器在seps中是否安全?未测试,因为您没有提供任何示例数据。@Inian,我添加了示例输入以及相应输出的外观与实际外观。我是否也应该发布脚本本身?(~30行)发布一个简短的脚本,演示您请求帮助的问题。我们不需要查看遇到此问题时正在运行的任何较大的脚本。只需发布一篇演示此问题的文章。@JamesBrown gawk拆分似乎满足了我的要求,但我宁愿保持它与POSIX兼容。我想我可以使用sub来查找原始数字并用脚本生成的数字替换,但是处理重复的数字会有点麻烦。因此我想没有办法更改字段并保留字段分隔符。我认为在我的例子中,最干净的解决方法是您提到的match和substr循环,但我很高兴我们得到了一些其他建议,无论谁有相同的问题,但非常不同的脚本都可以使用。非常感谢。所以我想没有办法改变一个字段并保留字段分隔符。我认为在我的例子中,最干净的解决方法是您提到的match和substr循环,但我很高兴我们得到了一些其他建议,无论谁有相同的问题,但非常不同的脚本都可以使用。非常感谢。