Можно ли использовать uniq, чтобы удалить одну дублирующую строку, сохранив при этом другую?

У меня есть файл номеров на разных строках. Есть много дубликатов. Я хотел бы удалить одну строку дубликатов, сохраняя при этом другую строку.

uniq -d удаляет обе строки. Есть ли способ удалить только одну строку, оставив вторую идентичную строку?

2 ответа

  • Сортировать числа с sort
  • Удалить дубликаты с uniq, Вам не нужен вариант.

Пример с цифрами и двумя пустыми строками:

$ cat unsorted

1
2
3
1
2
3
4
3
2
1

$ sort unsorted


1
1
1
2
2
2
3
3
3
4
$ sort unsorted | uniq

1
2
3
4

Если вы хотите вывести только первое вхождение каждой строки без сортировки, используйте awk или же perl поддерживать хеш (ассоциативный массив)

awk '!a[$0]++' file

или же

perl -ne 'print unless $h{$_}++' file

Если вы хотите сохранить последнее вхождение, сделайте то же самое, но прочитайте файл в обратном направлении и измените его после:

tac file | awk '!a[$0]++' | tac

Для более сложных удалений (таких как удаление всех, кроме второго из нескольких дубликатов, при печати всех неповторяющихся строк), я думаю, вам нужно будет обработать файл дважды.

Другие вопросы по тегам