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,但我想将这些字符保留在输出中。

一个快速尴尬的单行:

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

输出:

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

在这里,我们在gsub命令中使用&的特殊含义:它代表machted表达式。因此,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

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

我会在这个用例中使用sed

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

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


如果由于分隔符后的字符数不固定而无法从末尾计算字符数,则可以使用以下sed命令:

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

我正在使用(s|t)后跟 1 个或多个字符来搜索st,直到既不s也不t

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

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

等效的awk是

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

最新更新