更改字段而不更改 $0 中的字段分隔符
Change field without changing field separator in $0
在 AWK 中分配给任何字段时,将重新计算 [=13=]
,并将原始字段分隔符替换为输出字段分隔符 (OFS
)。但是我希望 [=13=]
中的字段分隔符在我更改字段时保持不变。我的输入字段分隔符 (FS
) 是一个正则表达式,所以简单地使输出文件分隔符与输入文件分隔符相同是行不通的。
有什么方法可以在不更改 [=13=]
中的字段分隔符的情况下更改字段?
编辑:
我的输入字段分隔符是 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
我不明白您问题的详细信息,但是要在不更改字段分隔符的情况下更改字段,您可以在整个记录上使用正则表达式。看:
$ echo 'a;b;c;d' | awk -F';' '{="X"}1'
a b X d
$ echo 'a;b;c;d' | awk 'match([=10=],/^([^;]*;){2}/){head=substr([=10=],RSTART,RLENGTH); tail=substr([=10=],RSTART+RLENGTH); sub(/^[^;]*/,"",tail); [=10=] = head "X" tail } 1'
a;b;X;d
是的,它有更多的代码,但它在不将 FS 更改为 OFS 的情况下进行了字符串替换。它可以用 GNU awk 更简洁地完成,但是因为你想要 POSIX...
如果你的 FS 不能被否定,替代方案是使用 match()+substr() 的循环。
如果您编辑您的问题以包含 mcve 以及简洁、可测试的示例输入和预期输出,那么您可以获得更多帮助。
在 AWK 中分配给任何字段时,将重新计算 [=13=]
,并将原始字段分隔符替换为输出字段分隔符 (OFS
)。但是我希望 [=13=]
中的字段分隔符在我更改字段时保持不变。我的输入字段分隔符 (FS
) 是一个正则表达式,所以简单地使输出文件分隔符与输入文件分隔符相同是行不通的。
有什么方法可以在不更改 [=13=]
中的字段分隔符的情况下更改字段?
编辑:
我的输入字段分隔符是 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
我不明白您问题的详细信息,但是要在不更改字段分隔符的情况下更改字段,您可以在整个记录上使用正则表达式。看:
$ echo 'a;b;c;d' | awk -F';' '{="X"}1'
a b X d
$ echo 'a;b;c;d' | awk 'match([=10=],/^([^;]*;){2}/){head=substr([=10=],RSTART,RLENGTH); tail=substr([=10=],RSTART+RLENGTH); sub(/^[^;]*/,"",tail); [=10=] = head "X" tail } 1'
a;b;X;d
是的,它有更多的代码,但它在不将 FS 更改为 OFS 的情况下进行了字符串替换。它可以用 GNU awk 更简洁地完成,但是因为你想要 POSIX...
如果你的 FS 不能被否定,替代方案是使用 match()+substr() 的循环。
如果您编辑您的问题以包含 mcve 以及简洁、可测试的示例输入和预期输出,那么您可以获得更多帮助。