2017-03-28 9 views
1

私は1つが-Fフラグを使用してフィールドセパレータを設定する方法を示しているanother answerをお読みください。AWKのフィールド区切り記号に正規表現を使用するには?

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

は今、私はフィールドセパレータ用の正規表現を使用することができますどのように興味があります。私の試みは、以下に見られることができます。

$ 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 

私は次のような出力を得るために期待していたが:

foo 
bar 
baz 

これは私の正規表現\d+ \d+マッチ「スペースで区切って最初の2つの数字は、続いているので、スペース"。しかし、私は2番目のレコードを印刷しています。 rubularに示すように:

enter image description here

  • は、どのように私はawkのフィールドセパレータとして正規表現を使うのですか?
+0

私はawkの私は$ 2、第2のレコード – mbigras

+1

はダウがPerl的 '\ D 'メタ文字をサポートしていないawkのを印刷しています。 '\ d'の代わりに' [[:digit:]] 'のPOSIX文字クラスを使います。 https://www.gnu.org/software/gawk/manual/html_node/GNU-Regexp-Operators.html – dawg

答えて

2

まず第1にechoは自動エスケープせずにリテラルを出力します。エスケープを有効にするには、-eを追加する必要があります。第2のすべて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 
関連する問題