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

awk '{ printf "%s",$0 }; /"$/ { print ""; };' inputfile

В выходных данных должна быть новая строка, только если входная строка заканчивается двойными кавычками. Таким образом, этот код awkвыводит все входные строки без новой строки. После этого он проверяет, заканчивается ли строка ввода на ", и если да, то выводится новая строка.

1
10.03.2020, 00:43
5 ответов

С 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)
3
28.04.2021, 23:21

Я предлагаю это:

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
1
28.04.2021, 23:21

Сохранение двух хэшей, %Hбудет отслеживать, встречалось ли ключевое (первое поле $F[0])или было ли оно замечено ранее. Если да, то мы запихиваем значение undefдля этого ключа в хэш %h. OTW, строка $_заполнена. В конце фазы чтения записи, также известной как eof, мы просто публикуем значения хэша %h.

% perl -ane '@F and $h{$F[0]} = $H{$F[0]}++ ? undef : $_}{print values %h' 1.txt 2.txt 3.txt

выход:

carB    2
acnB    2
aroK    2
acrB    1
eno     2
0
28.04.2021, 23:21

Использование Миллера(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
0
28.04.2021, 23:21

Сawk:

awk '
  n[$1]++ {delete s[$1]; next}
  {s[$1] = $0}
  END {for (i in s) print s[i]}' [123].txt
0
28.04.2021, 23:21

Теги

Похожие вопросы