ファイル1:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
ファイル 2:
9 10 11 12
21 22 23 24
1 2 3 4
17 18 19 20
私はUnixが初めてで、重複を印刷するのではなく、各ファイルから一意の行を取得して新しいファイルに出力しようとしています。ファイルはソートされていません。
ファイル1:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
ファイル 2:
9 10 11 12
21 22 23 24
1 2 3 4
17 18 19 20
私はUnixが初めてで、重複を印刷するのではなく、各ファイルから一意の行を取得して新しいファイルに出力しようとしています。ファイルはソートされていません。
あなたがしsort -n
たいuniq -u
:
$ sort -n file1 file2 | uniq -u
5 6 7 8
13 14 15 16
21 22 23 24
# Redirect to file3
$ sort -n file1 file2 | uniq -u > file3
編集:
$ awk '{u[$0]++}END{for(k in u)if(u[k]==1)print k}' file1 file2
5 6 7 8
21 22 23 24
13 14 15 16
u
これが連想配列の名前です。どんな名前でもかまいません(unique の略で u を選びます) 。配列内のキー(k)はファイル内の行であるため、重複する行が見つかるたびにカウントが増加します。配列が構築された後、配列をループし、キーが 1 回しか表示されなかった場合にのみキーを出力します。このコードはそれをクリアするのに役立ちます。
$ awk '{uniq[$0]++}END{for (key in uniq)print uniq[key]": "key}' file1 file2
2: 9 10 11 12
1: 5 6 7 8
1: 21 22 23 24
1: 13 14 15 16
2: 17 18 19 20
2: 1 2 3 4
両方のファイル全体から一連の一意の行が必要であると仮定します。
sort -u File1 File2 > File3
UPD: -u
GNU coreutils に固有の可能性があります。ソートがサポートしていない場合は、@sudo_O からの回答を参照してください。
UPD2: @sudo_O が質問を別の方法で解釈したことが判明しました: 重複した行を一度含める必要があると想定しましたが、彼はそれらを削除する必要があると想定しました。私が正しければ、これsort|uniq
が非 GNU の代替手段ですsort
。そうでなければ、sort|uniq -u
これまでのところ最良の解決策です。