удалить строки с повторяющимися словами

2497
anon123

У меня есть отсортированный файл с такими строками

word1 abca word1 abcb word1 abcc word2 abca word2 abcb word3 abbb ........... 

и я хочу что-то подобное

word1 abca word2 abca word3 abbb ........... 
1
Вы должны предоставить более подробную информацию. Вам нужна только первая запись для каждого слова1, слово2 ...? Gh0sT 10 лет назад 0
не имеет значения, является ли это первая запись, вторая или следующая, и так далее, это должна быть только одна строка со словом1 или словом2 и т. д. anon123 10 лет назад 0

3 ответа на вопрос

3
glenn jackman

Это волшебное заклинание - известная идиома awk:

awk '!seen[$1]++' file 

При первом появлении строки с этим $ 1 она печатается.

1
suspectus

Решение awk - использование переменной для обнаружения нового слова. Если новое слово найдено, выведите строку и присвойте переменную текущему слову.

Поскольку файл данных отсортирован, только 1-й случай каждого слова напечатает запись.

 awk 'BEGIN w!=$1 ' your-file 
0
terdon

Вы также можете использовать -wфлаг, uniqкоторый говорит ему сравнивать только первые N символов. Детали того, будет ли это работать для вас, зависят от ваших фактических данных, но если длина слова установлена ​​или ограничена, она должна работать:

$ sort file.txt | uniq -w 5 word1 abca word2 abca word3 abbb 

В качестве альтернативы, измените порядок полей и используйте, uniq -f 1чтобы пропустить сравнение 1-го поля:

$ awk '' file.txt | uniq -f 1 | awk '' word1 abca word2 abca word3 abbb 

Или получите 1-е поля, а затем grepих, ограничивая поиск первым соответствием:

$ for i in $(awk '' file.txt | sort -u); do grep -m 1 $i file.txt; done word1 abca word2 abca word3 abbb 

И, для завершения, Perl:

$ perl -ane 'print if $k{$F[0]}++<1' file.txt  word1 abca word2 abca word3 abbb 

Похожие вопросы