ファイル[重複]から共通行を削除する

ファイル[重複]から共通行を削除する

ファイルが2つあります。ファイルA&文書B

fileAには多くのIPがあり、fileBには少ないIPがあります。私たちは何をすべきですか?

fileA - fileB = fileC (パブリック IP を持たないファイル)

ファイルA

1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
5.5.5.5

文書B

4.4.4.4
1.1.1.1

ファイルC

2.2.2.2
3.3.3.3
5.5.5.5

Google には多くのオプションがありますが、関連項目が見つかりません。

答え1

このcommツールは、特に英数字でソートされた結果に興味がない場合に便利です。

comm -23 <( sort -u fileA ) <( sort -u fileB ) >fileC

使用方法の詳細については、およびman sortを参照してください。man comm

答え2

これにはfileA - fileBawkを使用できます(これを行うとIPだけを取得できませんfileB)。

awk 'NR==FNR{a[$0];next}!($0 in a)' fileB fileA

NR合計レコード数を表し、FNR現在のファイルのレコード番号(通常行番号)を示します。したがって、最初のファイルに行がある場合、2番目のファイルには表示されません。


fileA から重複行を削除する必要がある場合は、次のようにします。

awk 'NR==FNR{a[$0]++;next}!a[$0]++' fileB fileA

答え3

この質問はさまざまな方法で説明できます。

各行はそのファイル内で一意であると仮定します。

  • fileAにある項目を削除するとしますfileB

    fileBこれにより、次に見つかったIPアドレスが削除されますfileA

    grep -v -Fx -f fileB fileA >fileC
    

    ここで使用されているオプションは、grepパターン(fileBusingから読み取られた行-f)が正規表現(-F)ではなく文字列として扱われ、部分文字列()ではない行全体と一致することを確認します-x。また、一致の意味を変更して、どの行とも一致しないすべての行を-v出力します。fileAfileB

  • 独自のすべてのアイテムを取得したいとしましょう。fileA または独自の機能は次のとおりですfileB

    次の出力ファイルに重複しない行があります。非標準ですが、後続の行で繰り返されない線を出力するためによく使用されるオプションである-uwithを使用します。uniq

    sort fileA fileB | uniq -u >fileC
    

答え4

順序を維持することが重要でない場合は、まず最初のファイルから重複エントリを削除し、次に出力を2番目のファイルと2回リンクし(固有のエントリを削除するため)、次にuniq -u.

sort -u fileA | cat - fileB fileB | sort | uniq -u

関連情報