パイプを介してインタラクティブにawkを使用する

パイプを介してインタラクティブにawkを使用する

見ているこの問題awk、ファイルが標準入力にパイプされていると、ユーザー入力を読み取ることはできませんが、コマンドライン引数として指定されたファイルから入力を読み取ることが期待どおりに機能することを確認しました。

たとえば、スクリプトに次のBEGINブロックがあるとしますawk

BEGIN {
    printf "Enter input: "
    getline var < "-"
}

これを実行すると、awk -f ./script.awk file.txtユーザーに入力するように求められ、処理が続行されますfile.txt。ただし、これを実行すると、cat file.txt | awk -f ./script.awkawkがパイプから取得した内容をユーザー入力として解釈すると考えられます(したがって、最初の行がgetline埋められます)。varfile.txt

awkファイルから読み取るように動作しますが、パイプで使用する方法はありますか?

もちろん、一時ファイルを使用することもできますが、これはエレガンスから離れています。

ベストアンサー1

プロセスの置き換えは簡単な場合には機能しますが、パイプデータを処理しながらコンソールユーザーと対話できる一般的なアプローチは次のとおりです。

BEGIN {
    printf "Enter input: " > "/dev/tty"
    getline var < "/dev/tty"
    print var
}

おすすめ記事