我有 3 個具有相似數據的檔案。我想要一個 bash 腳本,它可以讀取這 3 個檔案並輸出唯一的條目及其值。例子:
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
使用 GNUuniq
或相容(用於-w
選項):
sort {1,2,3}.txt | uniq -u -w5
acnB 2
acrB 1
aroK 2
carB 2
eno 2
編輯:為了使第一個字段的長度更加靈活,可以實施吉列爾莫的一些方法。
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