他のファイルにない限り、ファイルの行をインポートするツールはありますか?

他のファイルにない限り、ファイルの行をインポートするツールはありますか?

ファイルAには含まれているがファイルBには含まれていない行をインポートするためのツールはありますか? Perlなどで簡単なスクリプトを作成できますが、似たようなものがすでに存在する場合は、今から時間を節約します。

答え1

はい。ファイルからテキスト文字列を取得するための標準ツールをgrep使用すると、あるファイルのすべての行を別のファイルから減算できます。

grep -F -x -v -f fileB fileA

これは、fileBの各行をパターンとして使用し()、-f fileBそれを一致させる通常の文字列(正規正規表現ではない)として処理することによって-F行われます()。行全体で一致が-x発生するように強制し()、一致しない行のみを印刷します(-v)。したがって、印刷する fileA の行には、fileB の行と同じデータは含まれません。

この解決策の欠点は、行の順序を考慮せず、入力の他の場所に重複行がある場合に期待される結果が得られないことです。解決策は実際の比較ツールです(たとえば、diff.ファイルAをファイルBに変換しています。(このコマンドはフォーマット後に正しい行を得るためにdiffも削除します)。

diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC

答え2

答えは、比較するファイルの種類と形式によって大きく異なります。

比較するファイルがソートされたテキストファイルの場合、Richard StallmanとDavid McKenzieによって作成されたGNUツールが呼び出されます。comm必要なフィルタリングを実行できます。 coreutilsの一部です。

はい

次の2つのファイルがあるとしましょう。

$ cat a
1
2
3
4
5

$ cat b
1
2
3
4
5
6

bファイルに存在しないファイルの行a:

$ comm <(sort a) <(sort b) -3
    6

答え3

~からスタックオーバーフロー...

通信-23ファイル1ファイル2

-23 file2の行(-2)と両方の行(-3)に表示される行を抑制し、file1の一意の行のみを残します。ファイルはソートする必要があります(例に示されています)、そうでない場合は、まずソートを介してパイプします。

マニュアルページをご覧くださいここ

-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)

答え4

ファイルが大きく、アイテムにカスタム順序がない場合は、grepに時間がかかりすぎます。迅速な選択肢は

sort file1 > 1 
sort file2 > 2 
diff 1 2 | grep "\>" | sed -e 's/> //'

[file2-file1結果が画面に表示され、ファイルにパイプされるなど]

>に変更すると、<逆の減算が行われます。rm 1 2

関連情報