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

Один из:

tmux new -d \; send ls Enter
tmux new -d \; setw remain-on-exit on \; respawnw -k ls
tmux new -d 'ls; sleep 1000000'

Конечно, если ваша программа не завершается сама по себе (скажите top вместо ls ), вы можете просто:

tmux new -d top
6
05.11.2020, 15:15
4 ответа

Использованиеawk:

$ awk 'seen[$0]++; seen[$0] == 2' file
Happy sad
Happy sad
Happy sad
Happy sad
Happy sad
Mad happy
Mad happy

При этом текст каждой строки используется в качестве ключа в ассоциативный массив seen. Первое seen[$0]++вызовет печать строки, которая была видна ранее, поскольку значение, связанное с этой строкой, будет не равно -нулю во второй и последующие разы. seen[$0] == 2вызывает повторную печать строки, если это второй раз, когда строка видна (без этого, вы пропустите одно вхождение каждой дублированной строки ).

Это связано с awk '!seen[$0]++', который иногда используется для удаления дубликатов без сортировки (, см., например,. Как работает awk '!a[$0]++'?).


Чтобы получить только одну копию дублированных строк:

awk 'seen[$0]++ == 1' file

или,

sort file | uniq -d
16
18.03.2021, 22:52

Изman uniq:

-D print all duplicate lines

Так можно достичь своей цели:

uniq -D file.txt
3
18.03.2021, 22:52

Если дубликаты не могут быть смежными, и вам нужно сохранить порядок во входных данных, вы можете сделать это с помощью awkи двух проходов, один для подсчета количества вхождений и один для печати строк, которые были просмотрены. повторяться более одного раза за первый проход:

awk 'second_pass {if (c[$0] > 1) print; next}
     {c[$0]++}' file.txt second_pass=1 file.txt
8
18.03.2021, 22:52

это, вероятно, -решение только для Linux, так как оно использует опцию uniq's -u. Вы можете обойти это, используя uniq -c, затем отфильтровав ^ *1 и т. д., если вы используете какой-то другой вариант.

sort < in | uniq --unique | grep --invert-match --line-regexp --fixed-strings --file - in

Выйдут первые 2 этапа

Mad sad
Sad happy

и на следующем этапе будут удалены строки, точно совпадающие с этими строками. Я выбрал более длинные варианты для ясности; Я сам редко ими пользуюсь Краткая форма будетsort < in | uniq -u | grep -v -x -F -f - in

0
18.03.2021, 22:52

Теги

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