2つのURLリストを比較し、新しく追加されたURLを新しいファイルに出力します


8

最初に、URLのリストを含む2つのファイルを作成します。それらをoldおよびと呼びnewます。2つのファイルを比較したいのですが、newファイル内にないURLがファイルにある場合は、oldこれらをextra_urlsファイルに表示したいと思います。

ここで、diffコマンドの使用についていくつか読みましたが、これからわか​​ることは、情報の順序も分析することです。注文が出力に影響を与えたくありません。私は、余分なURLの中に欲しいnewに印刷されたextra_urlsファイル、それらはいずれかの他の2つのファイルに配置されているどのような順序に関係なく。

これどうやってするの?

回答:


14

commコマンドを使用して2つのファイルを比較し、一方または他方に固有の行、または共通の行を選択的に表示できます。入力をソートする必要がありますが、プロセス置換を使用して、オンザフライでソートできます。

comm -13 <(sort old.txt) <(sort new.txt)

bashプロセスの置換をサポートしていないバージョンを使用している場合は、名前付きパイプを使用してエミュレートできます。例はWikipediaに示されています。


簡潔だが効果的-まさに必要なもの、私が必要とするもののための優れたコード。
neilH 2015年

うーん、でも入力がソートdiffされていると、同じことをしますよね?
2015年

diffすべての違いが表示されます。commファイル1、ファイル2の行を表示するか、共通の行を表示するかを選択できます。
Barmar 2015年

こんにちはBarmar、これを確認するかどうかわからないが念のため、このスクリプトをSynology Nasに移動して、そこから実行します。Synologyからスクリプトを実行しているので、構文エラーが発生します:60行目:構文エラー:予期しない "(​​"
neilH

bash実行されているのはどのバージョンですか?プロセスの置換をサポートしていない場合があります。
Barmar

6

私はただ使うでしょうgrep

grep -vFf old new > extra_urls

説明

  • -fgrepファイルから検索パターンを読み取るように指示します。この場合は、old
  • -v :一致しない行のみを出力するように、一致を反転するようにgrepに指示します。
  • -F:検索パターンを正規表現ではなく文字列として解釈するようにgrepに指示します。このよう.に、URLのは文字通り一致します。

これらを組み合わせると、にgrepない行が印刷さnewoldます。ファイル内のURLの順序は関係ありません。


こんにちはterdon、あなたの入力をありがとう。私はこれをテストしたところ、「新しい」ファイルに新しいURLがあるにもかかわらず、空の「追加のURL」_fileが生成されました。
neilH 2015年

@ bms9nmhうーん、それは奇妙です。入力ファイルの例を示すために質問を編集してください。これについてさらに話し合うことができるサイトのチャットルームに参加することもできます。
terdon

2
-Fプレーンテキストパターンを追加する必要があります
glenn jackman 2015年

1

順序はあなたにとって重要なので、使用してください awk

awk '
    NR == FNR {old[$1]=1; next}
    !($1 in old)
' old new > extra

1
こんにちはグレン、明確にするために、順序は重要ではありません。URLの順序は問題ではなく、2つのファイルの違い、つまり追加のURLだけです。何らかの方法で出力に影響を与えるために、違いを望まない。
neilH 2015年

@ bms9nmh:あなただけ変更される可能性> extra| sort > extra。または| sort -u > extra、新しいURLが入力に何回あるかに関係なく、出力に1回だけ表示する場合。入力順序は、それを防ぐために途中で余分な作業を行わない限り、出力順序に影響を与える傾向があります。
スティーブジェソップ2015年

@ steve、meh、commがこの質問に対する最良の答えですが、それでもgrep -Fvf良いの
です

0

meldというアプリケーションがあります。2つ(または3つ)のファイルを並べて表示し、違いを示し、1つのファイルから別のファイルへの選択的なコピーや文字の削除を可能にします。

Meldはターミナルからインストールできます

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