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_2
がfile_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