簡體   English   中英

AWK:如何使用列打印字段分隔符(字段分隔符也是一個正則表達式)

[英]Awk: how to print the field separator with your columns (field separator also a regular expression)

我有一個看起來像的文件

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,但我想將這些字符保留在輸出中。

如果將FS設置為正則表達式,則無法獲得確切的字段定界符。

我將在此用例中使用sed

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

s命令用空格和其本身&替換行...末尾$之前的最后3個字符。


如果由於定界符后的字符數不固定而使從末尾開始的字符計數不起作用,則可以使用以下sed命令:

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

我正在使用(s|t)后跟1個或多個字符的st搜索,直到都不是st

快速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是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM