当在awk中修改特定字段后,输出字段分隔符的信息是否总是丢失?如果有多个字段分隔符并且想要恢复它们,会发生什么?
例如,假设我有一个包含以下内容的简单文件example
:
a:e:i:o:u
如果我只运行一个 awk
脚本,该脚本考虑输入字段分隔符,并打印文件中的每一行,例如执行
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
在某些情况下,可能会有多个潜在的字段分隔符,但是如果有多个分隔符的情况下,是否有一种简单的方法来恢复原始的分隔符?
例如,如果“example”既有“:”又有“;”作为分隔符,我可以使用“-F”:|;”来处理文件,但OFS将无法足以恢复原始分隔符的相对位置。
更明确地说,如果我们切换到包含“example2”的内容。
a:e;i:o;u
我们可以使用
awk -F":|;" 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example2
使用-F"[:;]"
选项来获取
a:e!:i:o:u
但是我们已经失去了“:”和“;”之间的区别,如果我们能够恢复,这种区别将被保持。
a:e!;i:o;u
split()
函数中提供它。一旦您为split(<任何字符串>,...)
提供了该功能,您就可以将其用于split($0,...)
,因此没有必要以某种其他方式专门为$0
复制该功能,特别是考虑到该功能很少使用。 - Ed Morton