Как выбрать уникальные записи из нескольких текстовых файлов и распечатать их в выходном файле?

Как выбрать уникальные записи из нескольких текстовых файлов и распечатать их в выходном файле?

У меня есть 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

С GNU uniqили совместимым (для -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

Связанный контент