удалить первую строку, если есть дубликат

Я знаю, как удалить повторяющиеся строки, используя sort и uniq, но есть ли способ удалить первую строку, которая является дубликатом, а не второй?

Например, если у меня есть файл со следующими строками:

aaaaaaa
bbbbbbb
bbbbbbb
ccccccc
aaaaaaa
ccccccc

вывод должен быть:

bbbbbbb
aaaaaaa
ccccccc

Нужно ли запускать какой-то цикл или это легко сделать с помощью uniq? И да, я знаю, что обратная сортировка даст мне результат, но это не то, чего я хочу.

Спасибо.


person user2661167    schedule 07.08.2013    source источник
comment
Возможно, мне придется уточнить. Код должен сохранять самую новую строку, если она является дубликатом.   -  person user2661167    schedule 07.08.2013
comment
Если это дубликат (и вы сортируете вещи), какая разница, какой из дубликатов вы удаляете?   -  person Jiminion    schedule 07.08.2013
comment
я не хочу сортировать. Вывод должен быть в исходном порядке. sort $1 | uniq -d в итоге дает мне aaaaaa bbbbbb cccccc или cccccc bbbbbb aaaaaa ни один из этих выходов мне не нужен   -  person user2661167    schedule 10.08.2013


Ответы (1)


Добавьте последовательное поле в начало каждой строки, используя вставку (1,2,3...), затем переверните список на основе поля, а затем запустите uniq, игнорируя это поле. Затем отсортируйте по этому полю, чтобы убедиться, что они остались в правильном порядке. Затем удалите поле, используя cut или colrm.

person Jiminion    schedule 10.08.2013
comment
Это ничего не делает. 1 aaaaaaa 2 bbbbbbb 3 bbbbbbb 4 ccccccc 5 aaaaaaa 6 ccccccc становится 1 aaaaaaa 2 bbbbbbb 4 ccccccc - person user2661167; 11.08.2013
comment
Извините, я заметил, что вы хотели сохранить самую новую. Исправлено. - person Jiminion; 11.08.2013
comment
+1, например nl input.txt | sort -r -k2 | uniq -f 1 | sort | cut -f 2- или что-то менее хакерское в perl. - person Adrian Frühwirth; 21.08.2013
comment
@AdrianFrühwirth Спасибо за тяжелую работу! Но я нахожу Perl сложным, поэтому я приветствую вас и в этом. - person Jiminion; 21.08.2013