web-dev-qa-db-ja.com

2つのファイルのデータを比較して、共通の一意のデータを識別するにはどうすればよいですか?

2つのファイルのデータを比較して、共通の一意のデータを識別するにはどうすればよいですか? 100個のid/codes/number-setを含むファイル1があり、ファイル2とファイル1を比較したいので、行ごとに実行できません。

問題は、ファイル2にはファイル1のデータのサブセットと、ファイル2に固有のデータのサブセットが含まれていることです。次に例を示します。

file 1      file 2
1            1
2            a
3            2
4            b
5            3 
6            c

両方のファイルを比較して、各ファイルに共通で一意のデータを識別するにはどうすればよいですか? diffは役に立たないようです。

4

これが comm の目的です:

$ comm <(sort file1) <(sort file2)
        1
        2
        3
4
5
6
    a
    b
    c

最初の列は、ファイル1にのみ表示される行です。
2番目の列は、ファイル2にのみ表示される行です。
3列目は両方のファイルに共通の行です

commでは、入力ファイルをソートする必要があります

任意の列が表示されないようにexcludeするには、その列番号のオプションを追加します。たとえば、共通の行のみを表示するには、comm -12 ...またはfile2のみにある行comm -13 ...を使用します

5
glenn jackman

File1とfile2がソートされているかどうかに関係なく、次のように awk コマンドを使用します。

file1の一意のデータ:

awk 'NR==FNR{a[$0];next}!($0 in a)' file2 file1
4
5
6

file2の一意のデータ:

awk 'NR==FNR{a[$0];next}!($0 in a)' file1 file2
a
b
c

共通データ:

awk 'NR==FNR{a[$0];next} ($0 in a)' file1 file2
1
2
3

説明:

NR==FNR    - Execute next block for 1st file only
a[$0]      - Create an associative array with key as '$0' (whole line) and copy that into it as its content.
next       - move to next row
($0 in a)  - For each line saved in `a` array:
             print the common lines from 1st and 2nd file "($0 in a)' file1 file2"
             or unique lines in 1st file only "!($0 in a)' file2 file1"
             or unique lines in 2nd file only "!($0 in a)' file1 file2"
5
αғsнιη

xxdiffは、2つのファイル(またはディレクトリ)間の変更をグラフィカルに表示する必要がある場合にのみ一致します。

enter image description here

通常のdiffおよびcommと同様に、入力ファイルを最初にソートする必要があります。

sort file1.txt > file1.txt.sorted
sort file2.txt > file2.txt.sorted
xxdiff file1.txt.sorted file2.txt.sorted
0
whereisalext