awk:如何使用列打印字段分隔符(字段分隔符也是正则表达式)

时间:2016-06-02 16:05:34

标签: unix awk

我有一个看起来像

的文件
3 5 t27s60  
4 8 s30s40
2 2 t80t10
6 4 s80t10

我想制作像

这样的文件
3 5 t27 s60  
4 8 s30 s40
2 2 t80 t10
6 4 s80 t10

所以我将字段分隔符指定为s或t,但我想将这些字符保留在输出中。

3 个答案:

答案 0 :(得分:2)

AFAIK当FS被设置为常规表达时,无法获得确切的字段分隔符。

我会将sed用于此用例:

sed 's/...$/ &/' file

s命令将结尾...之前的行$中的最后3个字符替换为空格&

如果由于分隔符后面的字符数没有修复,从末尾计算字符不起作用,则可以使用以下sed命令:

sed -r 's/(s|t)([^st]+)$/ \1\2/' file

我正在使用s搜索t(s|t),后跟一个或多个字符,直到它们都不是st

答案 1 :(得分:2)

快速awk单行:

awk '{gsub(/[st]/," &",$0)}1' input.txt

输出:

3 5  t27 s60  
4 8  s30 s40
2 2  t80 t10
6 4  s80 t10

在这里,我们在&命令中使用gsub的特殊含义:它代表机器表达式。因此,gsub(/[st]/," &",$0)在每个" s"之前添加一个空白。或" t"

如果重复空白是个问题:

awk '{gsub(/[st]/," &",$0);gsub(/[ ]+/," ",$0)}1' input.txt

给出:

3 5 t27 s60 
4 8 s30 s40
2 2 t80 t10
6 4 s80 t10

答案 2 :(得分:1)

或perl,如果前一个字符不是空格,则在“s”或“t”之前添加一个空格:

perl -pe 's/(?<=\S)([st])/ $1/g' file

等效的awk是

awk '{print gensub(/([^[:blank:]])([st])/, "\\\1 \\\2", "g")}' file