Awk 更改字段而不更改$0中的字段分隔符

Awk 更改字段而不更改$0中的字段分隔符,awk,field,separator,Awk,Field,Separator,在AWK中分配任何字段时,将重新计算$0,并用输出字段分隔符(OFS)替换原始字段分隔符。但是我希望在更改字段时,$0中的字段分隔符保持不变。我的输入字段分隔符(FS)是一个正则表达式,因此简单地使输出文件分隔符与输入文件分隔符相同是不行的 在$0中,是否有任何方法可以在不更改字段分隔符的情况下更改字段 编辑: 我的输入字段分隔符是FS=“([^[:digit:][\\,][124;^)+0*[\\,][0*”。 我的脚本检查等号左侧的数字,并针对每行输入相应地更改右侧的数字(确切地说,它查找并

在AWK中分配任何字段时,将重新计算
$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循环,但我很高兴我们得到了一些其他建议,无论谁有相同的问题,但非常不同的脚本都可以使用。非常感谢。