awk '{ printf "%s",$0 }; /"$/ { print ""; };' inputfile
В выходных данных должна быть новая строка, только если входная строка заканчивается двойными кавычками. Таким образом, этот код awk
выводит все входные строки без новой строки. После этого он проверяет, заканчивается ли строка ввода на "
, и если да, то выводится новая строка.
С 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)
Я предлагаю это:
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
Сохранение двух хэшей, %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
Использование Миллера(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
Сawk
:
awk '
n[$1]++ {delete s[$1]; next}
{s[$1] = $0}
END {for (i in s) print s[i]}' [123].txt