Как удалить дубликаты строк из файла - PullRequest
15 голосов
/ 14 апреля 2009

У меня есть инструмент, который генерирует тесты и прогнозирует результат. Идея заключается в том, что если у меня возникнет ошибка, я смогу сравнить прогноз с фактическим результатом и увидеть, где они расходятся. Проблема в том, что фактический вывод содержит несколько строк дважды, что приводит к путанице diff. Я хочу удалить дубликаты, чтобы я мог их легко сравнить. По сути, что-то вроде sort -u, но без сортировки.

Есть ли какой-нибудь инструмент командной строки Unix, который может это сделать?

Ответы [ 5 ]

24 голосов
/ 14 апреля 2009

В дополнение к uniq ответам, которые отлично работают, если вы не возражаете sort сначала за файл. Если вам нужно удалить несмежные строки (или если вы хотите удалить дубликаты, не переставляя свой файл), следующий Perl-однострочник должен это сделать (украдено из здесь ):

cat textfile | perl -ne '$H{$_}++ or print'
19 голосов
/ 14 апреля 2009

уник (1)

СИНТАКСИС

uniq [ОПЦИЯ] ... [ВХОД [ВЫХОД]]

ОПИСАНИЕ

Отменить все, кроме одной из последовательных идентичных строк из INPUT (или стандартного ввода), записав в OUTPUT (или стандартный вывод).

Или, если вы хотите удалить несмежные дубликаты строк, этот фрагмент perl сделает это:

while(<>) {
    print $_ if (!$seen{$_});
    $seen{$_}=1;
}
1 голос
/ 18 июля 2011

Вот реализация awk, если среда не имеет / разрешает perl (еще не видел)! PS: Если дублирующих строк больше, чем один, то выводятся дублированные выходные данные.

awk '{

# Cut out the key on which duplicates are to be determined.
key = substr($0,2,14)

#If the key is not seen before, store in array,else print
if ( ! s[key] )
    s[key] = 1;
else
    print key;
}'
1 голос
/ 14 апреля 2009

Вот то, что я придумал, пока я ждал ответа здесь (хотя первый (и принятый) ответ пришел через 2 минуты). Я использовал эту замену в VIM:

%s/^\(.*\)\n\1$/\1/

Что означает: ищите строки, где после новой строки мы имеем то же, что и раньше, и заменяем их только тем, что мы захватили в первой строке.

uniq определенно проще, хотя.

1 голос
/ 14 апреля 2009

Если вы хотите удалить соседние повторяющиеся строки, используйте uniq.

Если вы хотите удалить все повторяющиеся строки, а не только соседние, то это сложнее.

...