次のコマンドがあるとします:
echo "1: " | awk '/1/ -F ":" {print $1}'
なぜawkが出力するのですか:
1:
次のコマンドがあるとします:
echo "1: " | awk '/1/ -F ":" {print $1}'
なぜawkが出力するのですか:
1:
回答:
「-F」はコマンドライン引数であり、awk構文ではありません。次を試してください。
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
ます。場合pattern
である(主に条件文)真、action
実行されます。pattern
が利用できない場合は、true
が暗示されます。ここでpattern
は、現在のレコードで正規表現に一致する/1/
州が1
$0
プログラムで行う場合は、FS
変数を使用できます。
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
ループではなくメインループで変更すると、現在の行がすでに分割されているBEGIN
ため、次に読み込まれる行に影響を与えることに注意してください。
:
セパレータとして設定する方法は複数あります。
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
全体を保存するためにファイルを使用する場合に使用する傾向がありますが-F
、ワンライナーで便利です。
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
およびawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
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の回答には適切な構文が含まれています...