私は2つのファイルを取得しました。約1 000行のfile1と数百行のfile2です。file2のすべての行がfile1にあるかどうかを確認したい。つまり:∀lineℓ∈file2:ℓ∈file1
これらの記号の意味や「file1にfile2のすべての行が存在するかどうかを確認する」という意味が誰にもわからない場合:どちらのファイルのいくつかの同等の行も、ファイルが要件を満たしているかどうかをチェックが返すかどうかには影響しません。
どうすればいいですか?
私は2つのファイルを取得しました。約1 000行のfile1と数百行のfile2です。file2のすべての行がfile1にあるかどうかを確認したい。つまり:∀lineℓ∈file2:ℓ∈file1
これらの記号の意味や「file1にfile2のすべての行が存在するかどうかを確認する」という意味が誰にもわからない場合:どちらのファイルのいくつかの同等の行も、ファイルが要件を満たしているかどうかをチェックが返すかどうかには影響しません。
どうすればいいですか?
回答:
comm -13 <(sort -u file_1) <(sort -u file_2)
このコマンドは、に固有の行を出力しfile_2ます。したがって、出力が空の場合、すべてのfile_2行がに含まれますfile_1。
commの男から:
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)
-u追加されたオプションsort。これで、ソートされた両方のファイルに一意の行のみが残ります。
<標準入力にパイプされると思っていました。ブラケット用語はこれを変更しますか?
file_1、事前にソートされた形式で保存することをお勧めします。入力と時間の両方を節約します。
awk特定のlength(array)機能(およびawkサポート可能な他の実装)をサポートするGNUを使用し、ファイルがソートされている場合は必要ありません。
gawk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
END{print (!length(seen))?"Matched":"Not Matched"}' file2 file1
これは、file2の行全体としてキーで呼び出される配列にfile2を読み込んseenでいますます。
次に、file1を読み取りますを、表示された配列内の行と一致する場合は各行について、そのキーを削除します。
終了時にアレイが空手段内のすべての行であればFILE2に存在FILE1と印刷され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
file2にある場合にのみ空行または空白のある行を無視するNFには、条件に追加してNR==FNR && NF {...それらの配列への読み込みをスキップする必要があります。
length(array)gawk専用のAFAIKです。間違いなくPOSIXではありません。
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
Pythonプログラムを使用します。
#!/usr/bin/env python3
import sys
def open_arg(path):
return sys.stdin if path == '-' else open(path)
def strip_linebreak(s):
return s[:-1] if s.endswith('\n') else s
with open_arg(sys.argv[1]) as pattern_file:
patterns = set(map(strip_linebreak, pattern_file))
with open_arg(sys.argv[2]) as dataset_file:
for l in map(strip_linebreak, dataset_file):
patterns.remove(l)
if not patterns:
break
sys.exit(int(bool(patterns)))
使用法:
python3 contains-all.py file2 file1
プログラムの終了ステータスは、ファイル2のすべてのパターンが一致したかどうかを示します。
シェル(スクリプト)で終了ステータスを照会するには、$?特別な変数、またはコマンドの終了ステータスを評価する他の式(短絡演算子&&and ||やのような条件式など)を使用ifできwhileます。例:
if python3 compare-all.py file2 file1 && some-other --condition; then
# do stuff
fi
file22行が含まれてA、あなたが必要なのですfile1少なくとも2行を含むようにA?