ファイルのすべての行が別のファイルに表示されることを確認する

ファイルのすべての行が別のファイルに表示されることを確認する

2つのファイルがあります。 file1には約10,000行があり、file2には数百行があります。 file2のすべての行がfile1にあることを確認したいと思います。つまり、∀行ℓ∈file2:ℓ∈file1

このシンボルが何を意味するのか、または「file2のすべての行がfile1にあることを確認する」という意味がわからない人がいる場合:2つのファイルの複数の同等の行は、返されたファイルが要件を満たしていることを確認することに影響します。を与えません。

どうすればいいですか?

答え1

comm -13 <(sort -u file_1) <(sort -u file_2)

このコマンドはを出力しますfile_2。したがって、出力が空の場合、すべての行file_2file_1

特派員:

   With  no  options,  produce  three-column  output.  Column one contains
   lines unique to FILE1, column two contains lines unique to  FILE2,  and
   column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

答え2

[ $(grep -cxFf file2 <(sort -u file1)) = $(sort -u file2 | wc -l) ] && 
  echo all there || 
  echo some missing

file2の一致数(file1の一意の行)がfile2の一意の行の数と等しい場合は両方とも存在し、そうでなければ存在しません。

答え3

GNUを使用すると、特定の機能(および他の実装もawk可能)がサポートされ、ファイルがソートされている場合は必要ありません。length(array)awk

gawk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
    END{print (!length(seen))?"Matched":"Not Matched"}' file2 file1

これは読書ですファイル2seen次の行全体でキーを使用して呼び出されたファイルを配置します。ファイル2

それでは読んでください。ファイル1各行に表示された配列の行と一致する場合は、そのキーを削除します。

最後に、配列が空の場合はすべての行を意味します。ファイル2存在するファイル1そして印刷しますMatchedそれ以外の場合は表示されますNot Matched


すべての実装の互換性のためにawk

awk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
    END{for(x in seen);print (!x)?"Matched":"Not Matched"}' file2 file1

次の場合にのみ、空白行/空白のある行を無視してください。ファイル2、配列への読み込みをスキップするには、NF条件を追加する必要があります。NR==FNR && NF {...

答え4

diff -q <(sort -u file2) <(grep -Fxf file2 file1 | sort -u)

file1含めると、出力は生成されません。すべてのラインfile2ステータスを入力して終了します0。それ以外の場合は、このような内容が印刷されます。

Files /proc/self/fd/11 and /proc/self/fd/12 differ

と終了ステータス1

関連情報