字段替换后在awk中输出字段分隔符

字段替换后在awk中输出字段分隔符,awk,Awk,在awk中修改特定字段后,输出字段分隔符上的信息是否总是丢失?如果有多个字段分隔符,并且我希望恢复它们,会发生什么情况 例如,假设我有一个简单的文件example,其中包含: a:e:i:o:u 如果我只是运行一个考虑了输入字段分隔符的awk脚本,它将打印文件中的每一行,例如running awk -F: '{print $0}' example 我将看到原始行。但是,如果我直接修改其中一个字段,例如 awk -F: '{$2=$2"!"; print $0}' example 我没有得到

awk
中修改特定字段后,输出字段分隔符上的信息是否总是丢失?如果有多个字段分隔符,并且我希望恢复它们,会发生什么情况

例如,假设我有一个简单的文件
example
,其中包含:

a:e:i:o:u
如果我只是运行一个考虑了输入字段分隔符的
awk
脚本,它将打印文件中的每一行,例如running

awk -F: '{print $0}' example
我将看到原始行。但是,如果我直接修改其中一个字段,例如

awk -F: '{$2=$2"!"; print $0}' example
我没有得到原始行的修改版本,而是看到由默认空白分隔符分隔的字段,即:

a e! i o u
通过指定OFS,我可以获得原始版本的修改版本,例如:

awk -F: 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example
然而,在这种情况下,如果有多个势场分离器,但在多个分离器的情况下,是否有一种简单的方法恢复原始分离器

例如,如果
示例
同时具有
作为分隔符,我可以使用
-F:“
来处理文件,但OFS不足以将原始分隔符恢复到它们的相对位置

更明确地说,如果我们切换到
example2
包含

a:e;i:o;u
我们可以用

awk -F":|;" 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example2
(或
-F“[:;]”
)获取

但我们已经失去了:和;如果我们能恢复的话,它会被保留

a:e!;i:o;u

您需要将GNU awk用于保存分隔符的第四个参数to split(),就像RT用于RS一样:

$ awk -F'[:;]' '{split($0,f,FS,s); $2=$2"!"; r=s[0]; for (i=1;i<=NF;i++) r=r $i s[i]; $0=r} 1' file
a:e!;i:o;u

$awk-F'[:;]“{split($0,F,FS,s);$2=$2”!”;r=s[0];for(i=1;这是这里少有的好问题之一。为什么不简单地使用
-F'[:;]添加一个不起作用的示例呢“
。这将使问题变得完美-IMOPlicit example addedA field separator等效于RT将是一个明显的GNU扩展。我想知道他们为什么没有它。@MichaelVehrs这并不难,只是不必要的时间和内存消耗。Awk预计会非常高效。如果我们需要存储匹配的字符串对于每行上的每一个FS,它为几乎不需要的功能添加了周期。当然,您可以添加标志来打开/关闭它,但是字段拆分代码必须检查标志,如果不参考标志,您就无法再判断代码的功能。简单地提供一个功能更简单、更清晰、更高效n如果需要,您可以调用以执行所需的操作。此外,由于这是用于拆分字符串的有用功能,因此通常需要在
split()
函数中提供该功能,并且一旦将其用于
split(,…)
,您就可以将其用于
split($0,…)
因此,没有必要以其他方式专门为
$0
复制功能,特别是考虑到很少需要该功能。
$ awk -F'[:;]' '{split($0,f,FS,s); $2=$2"!"; r=s[0]; for (i=1;i<=NF;i++) r=r $i s[i]; $0=r} 1' file
a:e!;i:o;u