パイプで区切られたファイルからフィールドを印刷するにはどうすればよいですか?
質問
パイプ文字で区切られたフィールドを持つファイルがあり、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
これを行う方法はありますか
解決
ここで重要なのは、パイプ文字(|
)をシェルにエスケープする必要があるということです。 <!> quot; \|
<!> quot;を使用します。または<!> quot; '|'
<!> quot;シェルの相互作用から保護し、コマンドラインでawk
に渡されるようにします。
コメントを読む元のポスターには、フィールドを選択して印刷する前にfile
をフィルタリングすることを含む、元の問題の簡略版が表示されています。パススルーgrep
が使用され、フィールド選択のために結果がawkにパイプされました。これは、質問に表示されるまったく不要なcat file
を説明しています(grep <pattern> file
を置き換えます)。
ファイン、それは動作します。ただし、awkはそれ自体がパターンマッチングツールであり、/<pattern>/
を呼び出す必要なく、一致する行を見つけて作業することを信頼できます。次のようなものを使用します。
awk -F\| '/<pattern>/{print $2;}{next;}' file
<pattern>
ビットは、{next;}
に一致する行で後続のアクションを実行するように<=>に指示します。
失われた外観の<=>は、入力の次の行にスキップするデフォルトのアクションです。必要ではないようですが、昔からこの習慣があります...
他のヒント
または1つのコマンドを使用する:
cut -d '|' -f FIELDNUMBER
パイプ文字は、シェルが解釈しないようにエスケープする必要があります。簡単な解決策:
$ awk -F\| '{print $2}' file
別の選択肢は、文字を引用することです:
$ awk -F'|' '{print $2}' file
「file」にはパイプ記号が含まれていないため、何も出力されません。 「catファイル」を使用するか、単にawkプログラムの後にファイルをリストする必要があります。