3

私は 15 個の異なるファイルを持っており、それらすべてに共通の行のみを含む新しいファイルが必要です。例えば:

File1:

id1
id2
id3

file2:

id2
id3
id4

file3:
id10
id2
id3

file4

id100
id45
id3
id2

I need the output be like:

newfile:

id2 
id3

このコマンドは、ファイルのペアごとに機能することを知っています。

grep -w -f file1 file2 > 出力

しかし、2つ以上のファイルに対して機能するコマンドが必要です。

何か提案はありますか?

4

4 に答える 4

4

grep の使用

同じトリックを複数回使用できます。

$ grep -w -f file1 file2 | grep -w -f file3 | grep -w -f file4
id2
id3

ところで、正規表現-Fの一致ではなく、正確な一致を探している場合は、次のフラグを使用する方が適切で高速です。

$ grep -wFf file1 file2 | grep -wFf file3 | grep -wFf file4
id2
id3

awk の使用

$ awk 'FNR==1{nfiles++; delete fseen} !($0 in fseen){fseen[$0]++; seen[$0]++} END{for (key in seen) if (seen[key]==nfiles) print key}' file1 file2 file3 file4
id3
id2
  • FNR==1{nfiles++; delete fseen}

    新しいファイルの読み取りを開始するたびに、次の 2 つのことを行います。(1) ファイル カウンターをインクリメントしますnfiles。(2) アレイを削除しfseenます。

  • !($0 in fseen){fseen[$0]; seen[$0]++}

    現在の行が のキーでない場合はfseen、 に追加し、fseenのこの行のカウントをインクリメントしますseen

  • END{for (key in seen) if (seen[key]==nfiles) print key}

    最後のファイルの最後の行を読み取った後、 のすべてのキーを調べますseen。そのキーのカウントが、読み取ったファイルの数と等しい場合、そのキーをnfiles出力します。

于 2016-05-09T23:37:16.547 に答える