2016-07-04 281 views
4

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

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

a:e:i:o:u 

如果我只是运行一个awk脚本,它考虑了输入分隔符,即打印每一行中我的文件,例如as 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 

在这种情况下,然而,在存在多个潜在字段分隔符,但在多个分离的情况下是有简单的方法恢复原始分隔符?

例如,如果example有两个:;作为分隔符,我可以用-F":|;"处理文件,但会OFS没有足以恢复原来的隔板在它们的相对位置。

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

a:e;i:o;u 

我们可以使用

awk -F":|;" 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example2 

(或-F"[:;]"example2得到

a:e!:i:o:u 

,但我们已经失去了区别之间 ;这将一直保持下去,如果我们能恢复

a:e!;i:o;u 
+1

问题是这里罕见的好问题之一。为什么不简单地使用'-F'[:;]''来添加一个非工作示例。这会使问题变得完美 - imo – hek2mgl

+1

明确添加的示例 – borrible

+0

RT的字段分隔符相当于GNU扩展。我想知道他们为什么没有它。 –

回答

3

您需要使用GNU AWK第四届ARG分裂(),它保存了分隔符,就像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 

有没有自动填充的FS匹配字符串数组,因为在每次将记录分割为字段时,存储与FS相匹配的字符串的时间和内存会有多大的花费。相反,GNU awk人们提供了第4个arg来分割(),所以你可以自己做,如果/当你想要的时候。这是几年前在经验丰富的awk用户和gawk提供商之间的comp.lang.awk新闻组中进行的长时间对话的结果,因为他们都同意这是最好的方法。

请参阅split()https://www.gnu.org/software/gawk/manual/gawk.html#String-Functions