2

私は2つのファイルを持っています

最初のファイルは次のようになります。

www.example.com
www.domain.com
www.otherexample.com
www.other-domain.com
www.other-example.com
www.exa-ample.com

2 番目のファイルは次のようになります (;;; の後の数字は 0 ~ 10 です):

www.example.com;;;2
www.domain.com;;;5
www.other-domain;;;0
www.exa-ample.com;;;4

そして、これら2つのファイルを比較して、次のように3番目のファイルに出力したい:

www.otherexample.com
www.other-example.com

どちらのファイルもサイズが大きい (500 MB 以上)

4

5 に答える 5

6

comm(1)2 つのソートされたファイルを比較し、違いを示すために使用します。と を使用grep(1)sort(1)て、ファイルを との比較に適した入力形式に変換しますcommプロセス置換を使用しbashて、それを結び付けます。

comm -23 <(sort file1.txt) <(grep -o '^[^;]*' file2.txt | sort)

への-23引数commは、両方のファイルに共通する行 ( -3) とファイル 2 に固有の行( ) を無視するように指示します-2。正確な仕様に応じて-1-2またはを使用できます-3

grep -o '^[^;]*' file2.txt最初のセミコロンの後のすべてを削除するだけです。これに使用できますsed(1)が、行の一部のみを抽出し、他に何も追加しない場合は、grep多くの場合高速になります。

comm入力ファイルをソートする必要があるため、sortを使用してソートします。出力はソートされます。sortはロケール固有の照合を使用するため、必要な正確な照合に応じて LC_ALL=C を設定する必要がある場合があります。

あなたの質問では、ファイル 2 に www.other-domain がありますが、ファイル 1 には www.other-domain.com があることに注意してください。出力を考えると、ファイル 2 のタイプミスだと思います。

これにより、すべてのプロセスが並行して実行され、それらを介してファイル データがストリーミングされます。そのため、ファイルが大きい場合でも、一時ファイルを保存するために多くのメモリや余分なディスク領域を占有することはありません。

于 2012-05-31T10:55:42.310 に答える
3

の入力にfile2の内容のサブセットが含まれている場合はfile1

sed 's/;.*//' file2 | fgrep -vxf - file1 >not-in-file2

diffまたはにも同じ一般的な考え方を適用できますcomm。ただし、commソートされた入力が必要ですが、それが問題にならない場合 (またはデータを最初からソートできる場合) は、 からのデータを前処理するだけfile2です。

sed 's/;.*//' file2.sorted | comm -12 - file1.sorted >cmp.out

入力をソートする必要があるという制約はcomm、常に最新のデータをメモリに保持する必要があるため、非常に大きなファイルを処理できるようにするものです。awk独自のカスタムスクリプトでも同じことができます。

于 2012-05-31T10:56:50.667 に答える
0

以下を使用できます。

$ diff file1 file2 > file3

しかし、あなたはその部分を無視したいようですよね;;0?次に、最後の部分を削除して行ごとに処理する必要があり、最後に、diff

于 2012-05-31T10:13:21.047 に答える
0

diffコマンドを使用して、出力を 3/3 ファイルに送信できます。例えば、 

% diff data1.txt data2.txt > diffs

diffのman ページには、比較 (処理と出力) を制御できる多数のオプションが示されています。

オプションを指定しない基本的なインタラクティブ操作では、投稿に表示するデータがファイルdata1.txtにあり、次のdata2.txt結果が得られると仮定します。

% diff data1.txt data2.txt 

1,6d0
< www.example.com
< www.domain.com
< www.otherexample.com
< www.other-domain.com
< www.other-example.com
< www.exa-ample.com
于 2012-05-31T10:13:51.083 に答える
0

aが最初のコンテンツを含むファイルで、 が 2 番目のコンテンツを含むファイルである場合b:

while read line; do grep -q $line b || echo $line; done < a

2 番目のファイルで見つからないものを出力します。

于 2012-05-31T10:23:11.007 に答える