2017-02-20 8 views
1

両方のファイルには、最低2000行の文字列と数値データの行があります。 file2.txtからfile1.txtに重複しないデータを追加する方法。 基本的に、file2には新しいデータ行がありますが、file1.txtに重複する行を追加しないようにしたいと考えています。unixの2つのファイルを比較して、デルタを1つのファイルに追加してください。

  • File1.txt>これは、メイン・データ・ファイル
  • File2.txtである>このファイルは、我々が一緒になってFILE1

おかげで、

+0

行の順序は重要ですか?彼らは分類されていますか? – Barmar

+0

注文は重要ではありません。 – Vcode

答えて

4

ソート二つのファイルに追加する新しいデータを持っています重複を削除するには、-uオプションを使用します。

sort -u File1.txt File2.txt > NewFile.txt && mv NewFile.txt File1.txt 
+0

は50,000行のデータファイルでこれを試していますが、メモリ使用量に関してはかなり効率的です。私はかなり速く出力ファイルを得ました。私はこれが私の場合の解決策だと思う。 – Vcode

+0

@Barmer sort -uはレコードを実際にソートするのは何ですか? plsはほとんどの列が同じように見えますが、いくつかは異なっています。また、単語間の間隔が違うと、その行がユニークであるとみなされますか? – Vcode

+0

ソートキーのレコードをソートします。デフォルトでは行全体であり、スペースは重要です。特定のフィールドにキーを変更したり、スペースや大文字/小文字を無視するオプションがあります。マニュアルページを読んでください。 – Barmar

1

あなたはこのように、grepを使用することができます。

# grep those lines from file2 which are not in file1 
grep -vFf file1 file2 > new_file2 
# append the results to file1 
cat new_file2 >> file1 
+0

Hmm。メモリ使用の観点から、これは潜在的に高価なにおいをする。 ( 'sort'は利用可能なメモリよりも多くのメモリが必要な場合にはディスク上の部分を保持するために作業を中断することができますが、パターンリストを保持したり、構造リストを構築しようとすると' grep'がどのように動作するのかよく分かりません例外的に大きいソースのリストからの正規表現)。 –

+0

一方、これは既存の行の順序を保持し、ソートに時間を費やしません。ユースケースによっては、この3つの回答の中で、これが最良の解決策、または唯一の正しい解決策である可能性があります。 – hek2mgl

+0

公正な議論。私がOPであり、この方法が私のファイルが時間の経過とともに変更される唯一の方法であれば、ファイル*を一度*ソートする費用を食べてから、その後にcommメソッドを使用する...しかし、あなたが正しい、ここにすべてのユースケースがあります。 –

2

別のオプションかのファイルは、単にいくつかの選択肢を持っているために、ソートされた(と私はcommを:)好き)

comm --check-order --output-delimiter='' -13 File1.txt File2.txt >> File1.txt 
されます
+0

@CharlesDuffy:true、これは実際にソートされていると仮定します。 – Wrikken

+0

* nod *。ファイルがすべてあらかじめソートされている場合は、最も効率的なアプローチです。 (まあ、GNUマージソートフラグを使ったBarmarのアプローチを使うこともできますが、私はこの2つが同等の性能を持つと期待しています)。 –

+0

@Wrikkenこの場合のファイルはソートされません。あなたのスクリプトの中で "-13"とは何ですか? – Vcode

1

awkを使用:

awk '!a[$0]++' File1.txt File2.txt 
+0

これは既に存在しているアプローチに比べてどのような利点がありますか? 'grep -vf'アプローチよりもメモリが非効率的です。これは、メモリ内の2番目のファイルにしかない偶数行を保存しますが、既存のファイルからの行だけを保存できるためです。どのような利点が追加されます。 –

関連する問題