2010-04-08 2 views
13

Ищете awk (или sed) однострочный файл для удаления строк с вывода, если первое поле является дубликатом.Удалить строку, если поле повторяется

Пример для удаления дубликатов строк я видел это:

awk 'a !~ $0; {a=$0}' 

Пытались использовать его за основу, не повезло (я думал, меняя $ 0 до $ 1-х будет делать трюк, но похоже, не работает).

+0

Вы попросили удалить линии «если первое поле подставляется» ... что? Я предположил «то же значение, что и первое поле в некоторой предыдущей строке ввода»; другой человек предположил «определенную закономерность». Что вы намеревались? –

+0

Ваша измененная версия 'awk 'a! ~ $ 1; {a = $ 1} ''* работает для меня * для смежных дубликатов (например, отсортированного файла). ** Версия ** Джонатана Леффлера имеет то преимущество, что она будет работать для удаления дубликатов в несортированном файле, но за счет создания потенциально большого массива. –

+0

Я думаю, что моя главная проблема заключалась в том, что я имел дело с несколькими разными типами полевых разделителей и не определял FS должным образом – Kyle

ответ

25
awk '{ if (a[$1]++ == 0) print $0; }' "[email protected]" 

Это стандартное (очень простое) использование для ассоциативных массивов.

+0

Это сработало! У меня была еще одна ошибка, которую я не понимал, что, возможно, тоже вызывало у меня проблемы. Благодаря! – Kyle

8

это, как удалить дубликаты

awk '!_[$1]++' file 
+2

Использование '_' в качестве имени массива вызывает недоразумение, но оно работает. –

1

Если вы открыты для использования Perl:

perl -ane 'print if ! $a{$F[0]}++' file 

-a autosplits линию в @F массив, который индексируется, начиная с 0
Осадок %a помнит, если первое поле уже было замечено


Это родственный решение предполагает ваш разделитель полей является запятая, а не пробельные

perl -F, -ane 'print if ! $a{$F[0]}++' file 
Смежные вопросы