標準入力やファイルの入力を受け入れるスクリプトを書くには?

標準入力やファイルの入力を受け入れるスクリプトを書くには?

cat text.txt | driver.sh複数のファイルの入力を許可するawkスクリプト用のbashドライバがあります。./driver.sh file1.txt file2.txt ... [filen.txt]使ってみました。

   read var
   gawk -f awk_prac.awk $var

これはパイプにのみ適用されます。また、forループを使用してすべてのファイル名を読み取ろうとしましたが、パイプされたテキストでは機能しません。どんな意見でも感謝します。

ベストアンサー1

やりたいことに応じて2つの解決策がありますcat text.txt | driver.sh(ただし、それを書く方が良いでしょうdriver.sh <text.txt)。

  1. 読むデータからtext.txt
  2. 読むパス名からtext.txt

リストが空の場合は、「ドライバ」(実際にはラッパー)スクリプトを場所/dev/stdinパラメータリストに追加できます。

#!/bin/sh

if [ "$#" -eq 0 ]; then
    set -- /dev/stdin
fi

gawk -f awk_prac.awk "$@"

引数なしでラッパースクリプトを呼び出すと、awkスクリプトは標準入力ストリームから入力を取得します。

引用符を参照してください"$@"。これは、個別に引用された各位置引数(シェルスクリプト引数)に拡張されます。つまり、名前にスペースおよび/またはシェルワイルドカードを含むファイル名に適用されます。

awkコードで予想される場合一つ毎回ファイルを呼び出し、ループを使用します。

#!/bin/sh

if [ "$#" -eq 0 ]; then
    set -- /dev/stdin
fi

for pathname do
    gawk -f awk_prac.awk "$pathname"
done

標準入力で読むとは、読みたいという意味です。パス名処理するデータではなく標準入力では、次のものを使用できますxargs(パス名の数がawkスクリプト呼び出し用に生成されたコマンドラインの最大長を超える可能性があるため)。

#!/bin/sh

if [ "$#" -eq 0 ]; then
    cat
else
    printf '%s\n' "$@"
fi | xargs -r gawk -f awk_prac.awk

スクリプトに引数が指定されていない場合は、標準入力から直接パス名をcat渡します。xargs引数がある場合は、処理のために改行で区切られたリストとして印刷されますxargs。繰り返しますが、引用は"$@"不可欠です。

-rこのオプションは、複合ステートメントにそのデータがない場合にxargsユーティリティの実行を停止します。これは非標準オプションなので、マニュアルを確認してください。gawkifxargs

awkコードで予想される場合一つ各呼び出しはファイルを生成しxargsます-L 1

おすすめ記事