Это волшебное заклинание - известная идиома awk:
awk '!seen[$1]++' file
При первом появлении строки с этим $ 1 она печатается.
У меня есть отсортированный файл с такими строками
word1 abca word1 abcb word1 abcc word2 abca word2 abcb word3 abbb ...........
и я хочу что-то подобное
word1 abca word2 abca word3 abbb ...........
Это волшебное заклинание - известная идиома awk:
awk '!seen[$1]++' file
При первом появлении строки с этим $ 1 она печатается.
Решение awk - использование переменной для обнаружения нового слова. Если новое слово найдено, выведите строку и присвойте переменную текущему слову.
Поскольку файл данных отсортирован, только 1-й случай каждого слова напечатает запись.
awk 'BEGIN w!=$1 ' your-file
Вы также можете использовать -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