如何從多個文字檔案中選擇唯一的條目並在輸出檔案中列印?

如何從多個文字檔案中選擇唯一的條目並在輸出檔案中列印?

我有 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

相關內容