2016-12-01 5 views
0

のための入力を生成しないが、私は含むFILE1を持って言う:どのようにシェルがawkを

1,2,3,4 

私はこのような、そのファイルを処理するためのawkを使用することができます。

awk -v FS="," '{print $1}' file1 

また、私は、私は標準入力から読み込みを意味し、ここでは文字列でのawkを呼び出すことができます。

awk -v FS="," '{print $1}' <<<"9,10,11,12" 

コマンド1を予想通りの結果に1とコマンド2利回り9を生成します。私はsequentallyのawkで両方のファイルを解析する場合

4,5 

awk -v FS="," '{print $1}' file1 file2 

は私が手:

1 
4 

予想通り

は今、私は2番目FILE2を持っていると言います。

しかし、私は、ファイルからの読み込みを標準入力からの読み込みを混合していた場合、私は標準入力から読んでいる内容は無視されますし、ファイル内のコンテンツのみを処理します順:

awk -v FS="," '{print $1}' file1 file2 <<<"9,10,11,12" 
awk -v FS="," '{print $1}' file1 <<<"9,10,11,12" file2 
awk -v FS="," '{print $1}' <<<"9,10,11,12" file1 file2 

すべての3つのコマンドは次のようになります。

1 
4 

つまり、stdinの内容は単に破棄されます。シェルは何をしていますか?

興味深いことに私は、コマンド3を変更した場合:

awk -v FS="," '{print $1}' <<<"9,10,11,12",file1,file2 

私は単にファイル1/2として、理にかなって9を取得するには、標準入力からわずか2つのフィールドです。しかし、なぜ、その後も結果9をもたらすであろう

awk -v FS="," '{print $1}' <<<"9,10,11,12 file1 file2" 

awk -v FS="," '{print $1}' <<<"9,10,11,12" file1 file2 

展開されていませんか?

なぜ、stdinのコンテンツは無視されますか?コマンド1と2で同じ問題が発生します。シェルはここで何をしていますか?

私が上でコマンドを試してみた:バージョン4.2.53(1)、GNUのbashはファイルから

+2

何をしようとしていますか?あなたは自分の質問をして答えています! – NinjaGaiden

+0

**一般的な質問は**です: シェルはどのようにawkの入力を生成しますか? **特定の部分が**さ: しかし、なぜ が続いている のawk -v FS = "" '{$ 1印刷}' <<< "9,10,11,12" はFILE1 FILE2 展開されていません〜 awk -v FS = "、" '{print $ 1}' <<< "9,10,11,12 file1 file2" 結果9も得られますか? – FloHe

+0

'(少なくとも)' 'ksh'コマンドライン処理は' '<< str」の入力を '' -''を使ってstd-inから '' read-from-std-in ' awk '{print $ 1}' file1 - <<< "str" file2'。私はこれが他のシェルでも動作すると期待しています。がんばろう。 – shellter

答えて

1

標準入力、入力がうまく一緒に混在させないでください-release。この動作はawkに限定されているわけではなく、多くのコマンドラインアプリケーションで使用できます。

ファイルを1つずつ処理する必要があります。消費アプリケーションは、STDINの背後にある入力が開始および停止するときを制御することはできません。 echo a,b,c | awk -F, '{print $1}' file1 file2を見てください。着信する「ファイル」はどのような順序で読み込む必要がありますか?いつFNRをリセットする必要があるか、またはFILENAMEが何であるべきかを考えると、これを行うのは難しいことが明らかになります。

あなたがプレイできるトリックの1つは、シェルによって生成されたファイルディスクリプタからawk(または他のプログラム)を読み取らせることです。 awk -F, '{print $1}' file1 <(echo 4,5,6) file2は、最初に期待したことを行います。

ここでは、<(...)という構文(例:/proc/self/fd/11)で適切なファイル記述子が作成され、読み込みプログラムはファイルのように扱うことができます。 2番目の引数であるため、2番目の引数です。 FNRおよびFILENAMEはすべて、それらがすべきことは明らかです。

+1

explenation awk -F、 '{print $ 1}' file1 <(echo 4,5,6)file2 'もうまくいきました。したがって、本質的に、つまり、stdinとファイルからの読み込みを混在させた場合、それぞれawkのシェルは未定義の動作をもたらします。したがって、決定論的にするには、入力を一貫させる必要があります。つまり、ファイル記述子を介してすべてが読み込まれます。 – FloHe

+0

それは私の理解です、FloHe。 – joepd

関連する問題