У меня есть отсортированный файл с такими строками
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=""} w!=$1 {print;w=$1}' your-file
Вы также можете использовать флаг -w
uniq
который говорит ему сравнивать только первые N символов. Детали того, будет ли это работать для вас, зависят от ваших фактических данных, но если длина слова установлена или ограничена, она должна работать:
$ sort file.txt | uniq -w 5
word1 abca
word2 abca
word3 abbb
В качестве альтернативы, измените порядок полей и используйте uniq -f 1
чтобы пропустить сравнение 1-го поля:
$ awk '{print $2,$1}' file.txt | uniq -f 1 | awk '{print $2,$1}'
word1 abca
word2 abca
word3 abbb
Или получите 1-е поле и затем grep
для них, ограничивая поиск первым соответствием:
$ for i in $(awk '{print $1}' 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