パイプで区切られたファイルからフィールドを印刷するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/213855

  •  03-07-2019
  •  | 
  •  

質問

パイプ文字で区切られたフィールドを持つファイルがあり、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プログラムの後にファイルをリストする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top