「:」をawkフィールド区切り記号として使用する方法


243

次のコマンドがあるとします:

echo "1: " | awk '/1/ -F ":" {print $1}'

なぜawkが出力するのですか:

1: 

回答:


382

「-F」はコマンドライン引数であり、awk構文ではありません。次を試してください。

 echo "1: " | awk -F  ":" '/1/ {print $1}'

42
ここでの無知の質問:/ 1 /の部分はawkに1番の数字を含む行(より正確にはレコード)のみを処理するように指示することですか?
rantsh 2013年

3
@rantsh Awk構文は次のようになり(pattern){action}ます。場合patternである(主に条件文)action実行されます。patternが利用できない場合は、trueが暗示されます。ここでpattern、現在のレコードで正規表現に一致する/1/1$0
示さ

62

プログラムで行う場合は、FS変数を使用できます。

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

ループではなくメインループで変更すると、現在の行がすでに分割されているBEGINため、次に読み込まれる行に影響を与えることに注意してください。


35

:セパレータとして設定する方法は複数あります。

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

それらはすべて同等であり1、サンプル入力「1:2:3」の場合は次のように返されます。

$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1

どちらが望ましい方法ですか?BEGINステートメントを使用した最後の例が最も正しいと思います(全体的なawk構文と一致しています)。

1
@randomwareそれらはすべて問題ありません。BEGIN全体を保存するためにファイルを使用する場合に使用する傾向がありますが-F、ワンライナーで便利です。
fedorqui 'SO stop harming'

1
3番目のケースと他のすべてのケースの間には微妙な違いがあると言わざるを得ません。例:awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileおよびawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
kvantour


12

-Fawkそれ自身への引数です:

$echo "1: " | awk -F":" '/1/ {print $1}'
1

2
コロンを引用する必要はありません。
ceving

6

正規表現をフィールドセパレータとして使用することもできます。次の例では、正規表現を使用して「10」をセパレータとして設定し、「bar」を出力します。

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'

4

これだけ書く必要はありません。awkコマンドで-Fオプションを使用して希望のフィールドセパレータを配置し、指定したフィールドセパレータに従って、印刷する列番号を分離するだけです。

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1

4

AWKは、テキスト通訳として働く文書全体のためは行単位を行くと、それは、各ラインのfieldwiseを行くので、$ 1、$ 2 .. $ nは、それぞれの行のフィールドへの参照($ 1は最初のフィールドで、$ 2は2番目のフィールドであるというように...)。コマンドラインで「-F」スイッチを使用するか、「FS = ...」を使用して2つの角かっこ内でフィールドセパレータを定義できます。今度は "JUERGEN"の答えを考えてみましょう:

echo "1: " | awk -F  ":" '/1/ {print $1}'

フィールド境界の上に「:」が設定されているため、「1」である$ 1と空スペースである$ 2の2つのフィールドがあります。その後、最初のフィールドのみを出力するようにフィルターに指示する正規表現「/ 1 /」が続きます。通訳がそのような表現を含む行につまずいたとき(iは1を意味します); 「echo」コマンドの出力は「1」を含む1行なので、フィルターは機能します...

次の例を扱う場合:

echo "1: " | awk '/1/ -F ":" {print $1}'

構文は乱雑で、インタプリタは部分F ":"を無視することを選択し 、デフォルトのフィールドスプリッタに切り替えます。これは空のスペースなので、最初のフィールドとして "1:"を出力し、2番目のフィールドはありません!

JUERGENの回答には適切な構文が含まれています...


2

または、以下を使用できます。

echo "1: " | awk  '/1/{print $1-":"}' 

これは本当に面白い方程式です。


1
どういう/1/意味ですか?

パターンを見つけます。この場合は「1」で
ホセ・ディアス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.