コマンドラインを使用して2つのファイル間の共通部分を取得する


1

2つのファイル間の交差を取得する最も効率的な方法は何ですか?

sort file1 file2 | uniq -d

これはfile1では機能しません: "A \ nA"およびfile2は空です。
Sプラサンス

不明です。具体的にご記入ください。
アビナッシュラジ

回答:


3

grep次のようにコマンドラインを使用します。

grep -Fx -f file1 file2

file2とfile1を交換すると、これにより異なる結果が得られる場合があります。例:file1 = "A"、file2 = "A \ nA"。両方のファイルで行が発生する回数は適切に処理されません。また、grepはソートよりも効率が悪いはずです。この場合、1つのファイルのすべての行が他のファイルのすべての行と比較されるためです。
Sプラサンス

0

2つのファイルの内容を結合する場合は、次のコマンドを実行します。

awk 'NR==FNR' file1 file2

1
これは最初のファイルの内容を印刷するだけです。そして、問題は2つのファイルを結合することでもありません。
Sプラサンス

この質問から何を理解していますか?
アビナッシュラジ

1
交差点:どちらか一方のファイルだけでなく、両方のファイルに現れる行。
Sプラサンス

0

file1 = 'A \ nA'およびfile2 = 'A \ nA \ nA'とします。交差点は単に「A」または「A \ nA」ですか?言い換えれば、同じ行が両方のファイルに表示される回数は関連していますか?


「A」だけの場合、これは機能します。

sort <(sort file1 | uniq) <(sort file2 | uniq) | uniq -d

質問で与えられたアプローチの問題は、行が両方のファイルに存在しない場合でも、一方で繰り返された場合、結果に表示されることです。そのため、最初にを使用してファイル内の繰り返しを削除する必要がありますsort fileX | uniq


'A \ nA'の場合、これは機能します。

sort <(sort file1 | awk '{if ($0 == prev) c++; else c=0; print c, $0; prev = $0;}') <(sort file2 | awk '{if ($0 == prev) c++; else c=0; print c, $0; prev = $0;}') | uniq -d | cut -d' ' -f2-

いくつかのライナー(awk、sort、uniq、およびcut)を考えることができますが、どれもこれほど簡単ではありません。もちろん、これは簡単な解決策がないという意味ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.