2017-03-28 41 views
1

我讀another answer展示瞭如何可以使用-F標誌設置字段分隔符:如何在AWK中爲字段分隔符使用正則表達式?

awk -F 'INFORMATION DATA ' '{print $2}' t 

現在我很好奇我怎麼能使用正則表達式的字段分隔符。我嘗試下面可以看到:

foo 
bar 
baz 

這是因爲我的正則表達式\d+ \d+的比賽「用空格分隔第2號,其次是:

$ echo "1 2 foo\n2 3 bar\n42 2 baz" 
1 2 foo 
2 3 bar 
42 2 baz 
$ echo "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '\d+ \d+ ' '{ print $2 }' 
# 3 blank lines 

我期待得到下面的輸出空間」。但是我正在打印第二張唱片。如圖所示的rubular

enter image description here

  • 如何使用正則表達式作爲awk的字段分隔符?
+0

我AWK我打印$ 2,第二個記錄 – mbigras

+1

awk的道瓊斯指數不支持Perl化'\ D'元字符。你可以使用POSIX字符類'[[:digit:]]'而不是'\ d'。 https://www.gnu.org/software/gawk/manual/html_node/GNU-Regexp-Operators.html – dawg

回答

2

首先echo不會自動轉義並輸出文字\n。因此,您需要添加-e以啓用轉義。其次awk不支持\d所以你必須使用[0-9][[:digit:]]

echo -e "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '[0-9]+ [0-9]+ ' '{ print $2 }' 

echo -e "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '[[:digit:]]+ [[:digit:]]+ ' '{ print $2 }' 

兩個輸出:

foo 
bar 
baz 
+0

4秒的差異! –

+0

該死的!甚至最終看起來都一樣! :) – Vallentin

+0

哈哈! :)沒有再發生那麼小的差異。涼! –

2

只是[0-9]替換\d

有了這個,你可以打印所有的領域,你可以看到田野immediatelly:

$ echo -e "1 2 foo\n2 3 bar\n42 2 baz" |awk -v FS="[0-9]+ [0-9]+" '{for (k=1;k<=NF;k++) print k,$k}' 
1 
2 foo 
1 
2 bar 
1 
2 baz 

所以只需使用[0-9]在您的命令:

$ echo -e "1 2 foo\n2 3 bar\n42 2 baz" |awk -v FS="[0-9]+ [0-9]+" '{print $2}' 
foo 
bar 
baz