Можно ли использовать 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
Для более сложных удалений (таких как удаление всех, кроме второго из нескольких дубликатов, при печати всех неповторяющихся строк), я думаю, вам нужно будет обработать файл дважды.