
同様のデータを含む3つのファイルがあります。私はこの3つのファイルを読んで一意のエントリとその値を出力できるbashスクリプトが欲しいです。例:
1.txt
aceE 14
aceF 8
adhE 20
asnS 2
carB 2
dnaK 3
eno 2
2.txt
aceE 11
aceF 7
acnB 2
acrB 1
adhE 22
asnS 2
dapD 3
3.txt
aceE 16
aceF 10
adhE 18
aroK 2
asnS 3
dapD 4
dnaK 4
したがって、出力は次のようになります。
acnB 2
acrB 1
aroK 2
carB 2
eno 2
答え1
GNUまたは互換の使用uniq
(-w
オプションの場合):
sort {1,2,3}.txt | uniq -u -w5
acnB 2
acrB 1
aroK 2
carB 2
eno 2
編集:最初のフィールドの長さをより柔軟にするために、Guillermoのいくつかの方法を実装できます。
grep -f <(sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u) <(sort {1,2,3}.txt)
入力ファイルの区切り文字では<tab>
ないことがわかりました<space>
。これは、入力ファイルを質問に貼り付ける方法で変更されました。 :-(
これは<tab>
。
grep -f <(sort {1,2,3}.txt | cut -f1 | uniq -u) <(sort {1,2,3}.txt)
答え2
私はこれを提供する:
sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u | xargs -I '{}' grep -h "{}" {1,2,3}.txt
ファイル内容の並べ替え:
sort {1,2,3}.txt
最初の列のみを出力します。
cut -d' ' -f1
固有アイテムのフィルタリング:
uniq -u
acnB
acrB
aroK
carB
eno
出力が供給されるとgrep
:
xargs -I '{}' grep -h "{}" {1,2,3}.txt
acnB 2
acrB 1
aroK 2
carB 2
eno 2
答え3
そしてawk
:
awk '
n[$1]++ {delete s[$1]; next}
{s[$1] = $0}
END {for (i in s) print s[i]}' [123].txt
答え4
ミラーの使用(https://github.com/johnkerl/miller)と実行
mlr --csv --fs "\t" -N count-similar -g 1 then filter '$count==1' then cut -x -f count 1.txt 2.txt 3.txt
あなたはやる
carB 2
eno 2
acnB 2
acrB 1
aroK 2