2009-04-14 3 views
13

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

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

+0

Возможный дубликат [Как я могу удалить повторяющиеся строки в файле в Unix?] (Http://stackoverflow.com/questions/1444406/how-can-i-delete-duplicate-lines-in- a-file-in-unix) –

ответ

18

uniq(1)

СИНТАКСИС

Uniq [КЛЮЧ] ... [ВХОД [ВЫХОД]]

ОПИСАНИЕ

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

Или, если вы хотите удалить несмежные повторяющиеся строки, а этот фрагмент Perl сделает это:

while(<>) { 
    print $_ if (!$seen{$_}); 
    $seen{$_}=1; 
} 
+0

Ответ на Perl работает только если вы хотите первый элемент. Последнее было бы другим решением. – Xetius

+1

И для тех, кто не знает, как использовать Perl, это все, что вам нужно ввести: perl -pe 'print if $ seen {$ _} ++' [INPUT]> OUTPUT – reinierpost

+0

@Xetuis, Повторите одну и ту же строку :) Если вам нужна последняя строка, просто установите видимую запись на номер строки, не печатайте в цикле и затем распечатайте ее в порядке номера строки в конце. Но я не думаю, что это было сделано в этом случае. –

1

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

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

1

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

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

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

uniq определенно проще.

24

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

cat textfile | perl -ne '$H{$_}++ or print' 
+0

Я думаю, что это аккуратный ответ. Был программирование на Perl в течение примерно 6 лет и не думал о чем-то столь кратким – Xetius

+1

Часть Perl действительно изящна. Однако это относится к награде «Бесполезное использование кошки» :-) (см. Http://partmaps.org/era/unix/award.html). Просто используйте « sleske

+2

Я никогда не слышал об этой награде! Да, я иногда использую кошку довольно безвозмездно; Я понятия не имею, почему «cat x |» выглядит лучше, чем « y «делает мои глаза кровоточащими: P –

1

Вот реализация 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; 
}' 
+4

Если вы просто смотрите на всю строку, являющуюся ключом, это аналогично решениям perl: 'awk '! C [$ 0] ++' file' –

Смежные вопросы