awk - 標準入力からプログラムと入力を読みますか?

awk - 標準入力からプログラムと入力を読みますか?

awkは標準入力からプログラムと入力を読み取ることができますか?

ファイルを次の関数にパイプできるようにしたいです。

process_data () {
  awk -f - <<EOF
{print}
EOF
}

注:実際のプログラムは長く、コマンドライン引数として渡すことはできず、一時ファイルを使用したくありません。

現在は何も出力しません。

$ yes | head | process_data 
$ 

ベストアンサー1

process_data() {
  awk -f /dev/fd/3 3<< \EOF
  awk code here
EOF
}

コマンドライン引数には改行文字を含めることができ、長さ制限がありますが、通常は数百キロバイトを超えます。

awk '
  BEGIN {...}
  /.../ ...
  END {...}
'

問題がawkスクリプトに一重引用符文字を含めることに関連する場合、別のアプローチはコードを変数に保存することです。

awk_code=$(cat << \EOF
{print "'quoted' " $0}
EOF
)

そして、次のことを行います。

process_data() {
  awk "$awk_code"
}

おすすめ記事