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

Unix Awk:如何使用列打印字段分隔符(字段分隔符也是一个正则表达式),unix,awk,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,但我希望在输出中保留这些字符。AFAIK如果将FS设置为常规表达式,则无法获得准确的字段分隔符 对于这个用例,我将使用sed: sed 's/...$/ &/' file s命令将一行..末尾$之前的最后3个字

我有一个文件看起来像

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

AFAIK如果将
FS
设置为常规表达式,则无法获得准确的字段分隔符

对于这个用例,我将使用
sed

sed 's/...$/ &/' file
s
命令将一行
..
末尾
$
之前的最后3个字符替换为空格和本身
&


如果由于分隔符后的字符数不固定,从结尾开始计数字符不起作用,则可以使用以下
sed
命令:

sed -r 's/(s|t)([^st]+)$/ \1\2/' file
我正在搜索
s
t
,使用
(s | t)
后跟1个或多个字符,直到既不是
s
也不是
t
快速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
命令中使用了
&
的特殊含义:它代表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

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

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

为什么不
awk'{print$1”“$2”“substr($3,1,2)”“substr($3,3,2)}文件
?祝你好运。当一个字符出现在句子中时,不能使用2分隔符。大括号后面的1是什么?它使awk打印当前行,因为awk将1解释为
TRUE
。如果未指定其他内容,awk将打印该行。这只是一种快速编写
{print$0}
awk '{print gensub(/([^[:blank:]])([st])/, "\\\1 \\\2", "g")}' file