2016-05-03 10 views
3

私がいる限り、最初のファイルの内容彼らであるとして素晴らしい作品次のコマンドを実行しています:最初のファイルが空の場合、コマンドdoesntの仕事をAWK FNR == NR

awk -F, 'FNR==NR {a[tolower($1)]++; next} !a[tolower($1)]' OutSideSyncUsers.csv NewUsers.csv 

を。私はオンラインで参照が見つかりました:最初のファイルが空の場合、二ファイルのイディオムを使用

すべてのプログラムが正しく を動作しません(その場合には、awkはNR == FNRに関連するアクション を実行します2番目のファイルを読んでいる間)。これを修正するには、 を追加することで、NR == FNR条件を強化することができます。 のFILENAMEがARGV [1]と一致することを確認するテストを追加します。

イムわからない私は、どのように(あるいはどこ)クエリのテストチェックを追加する等しく理解ARGV [1]すべてのヘルプは

をapperciatedされるだろう

答えて

4

あなたはこのように、この追加の条件を使用することができます:

awk -F, 'ARGV[1] == FILENAME{a[tolower($1)]++; next} !a[tolower($1)]' OutSideSyncUsers.csv NewUsers.csv 

追加の条件ARGV[1]==FILENAMEは、最初のブロックのみが唯一の引数リストの最初のファイルのために実行されることを保証します。最初のファイルが空の場合、最初のブロックをスキップします。このようにして、2番目のブロック!a[tolower($1)]が常に引数リストの2番目のファイルで実行されていることを確認します。 GNU awkの使用ARGINDで

+1

素晴らしい、あなたの説明は私が探していた情報です – moore1emu

+1

私は私の答えに説明を追加しました。 'FILENAME'はすでに' awk'によって現在の入力ファイル名に設定されています。 – anubhava

+1

これは@EdMortonのスポットです。はい、確かに 'FNR == NR'はこのチェックの後には必要ありません。 – anubhava

4

awk -F, '{k=tolower($1)} FILENAME==ARGV[1]{a[k]; next} !(k in a)' OutSideSyncUsers.csv NewUsers.csv 

が、それは/もしあなたが同じファイルを解析する際には、二回失敗:

awk -F, '{k=tolower($1)} ARGIND==1{a[k]; next} !(k in a)' OutSideSyncUsers.csv NewUsers.csv 

他awksとの近似です。

+1

はい、良い例として 'ARGIND'を使用しています – anubhava