1

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

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

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

word1  abca
word2  abca
word3  abbb
...........

3 ответа3

3

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

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

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

1

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

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

   awk 'BEGIN{w=""} w!=$1 {print;w=$1}' your-file
0

Вы также можете использовать флаг -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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .