パイプ文字で区切られたフィールドを持つファイルがあり、2 番目のフィールドのみを印刷したいと考えています。この試みは失敗します:
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
これを行う方法はありますか?
または、1 つのコマンドを使用します。
cut -d '|' -f FIELDNUMBER
ここで重要な点は、パイプ文字 ( |) をシェルにエスケープする必要があることです。" \|" または " '|'" を使用して、シェルの干渉から保護awkし、コマンド ラインで渡せるようにします。
コメントを読むと、元のポスターはfile、フィールドを選択して印刷する前のフィルタリングを含む元の問題の単純化されたバージョンを示していることがわかります。パススルーgrepが使用され、フィールド選択のために結果が awk にパイプされました。これは、質問に表示されるまったく不要なものを説明cat fileします( を置き換えますgrep <pattern> file)。
うまくいきます。ただし、awk は主にそれ自体がパターン マッチング ツールであり、.wk を呼び出さなくても、一致する行を見つけて処理できると信頼できますgrep。次のようなものを使用します。
awk -F\| '/<pattern>/{print $2;}{next;}' file
/<pattern>/ビットは、awk一致する行に続くアクションを実行するように指示します<pattern>。
失われたように見えるの{next;}は、入力の次の行にスキップするデフォルトのアクションです。必要なさそうですが、私は昔からこの癖が...
シェルが解釈しないように、パイプ文字をエスケープする必要があります。簡単な解決策:
$ awk -F\| '{print $2}' file
別の選択肢は、文字を引用することです。
$ awk -F'|' '{print $2}' file
また、「ファイル」にはパイプ記号が含まれていないため、何も出力されません。「cat ファイル」を使用するか、単に awk プログラムの後にファイルをリストする必要があります。