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