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
)。
- 読むデータから
text.txt
。 - 読むパス名から
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
ユーティリティの実行を停止します。これは非標準オプションなので、マニュアルを確認してください。gawk
if
xargs
awk
コードで予想される場合一つ各呼び出しはファイルを生成しxargs
ます-L 1
。