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