Дедупликация с помощью awk в командной строке и скрипте

Дедупликация с помощью awk в командной строке и скрипте

У меня есть файл следующего формата:

487422,Potenza
487386,Forlì-Cesena
487399,Grosseto
487425,Catanzaro
487409,Napoli
487446,Prato
495498,Fermo
487425,Catanzaro
487389,Macerata
487442,Biella
487351,Asti
487424,Cosenza
487404,Roma
487359,Como
487404,Roma
487401,Terni
487420,Brindisi
487397,Arezzo
487348,Vercelli
487382,Modena
487356,Genova
487365,Cremona
487369,Verona
487386,Forlì-Cesena

Как вы видите, это текст, разделенный запятыми, с дубликатами. Я хотел бы дедуплицировать текст относительно столбца 1, используя awk.

Командная строка

Если я использую интерфейс оболочки, вот что я получаю

487422,Potenza
487386,Forlì-Cesena
487399,Grosseto
487425,Catanzaro
487409,Napoli
487446,Prato
495498,Fermo
487389,Macerata
487442,Biella
487351,Asti
487424,Cosenza
487404,Roma
487359,Como
487401,Terni
487420,Brindisi
487397,Arezzo
487348,Vercelli
487382,Modena
487356,Genova
487365,Cremona
487369,Verona

чего я и ожидал от следующей команды

awk -F"," '!a[$1]++' filename.csv

Скрипт Awk

Если я использую скрипт awk, написанный следующим образом

#!/bin/awk -f

BEGIN {
    FS=","
}
{
    {!a[$1]++}
}

Я не получаю никакого вывода. Что-то не так со скриптом? Почему поведение скрипта и командной строки отличается?

решение1

За пределами брекетов !a[$1]++находитсясостояние, который запускает действие по умолчанию, {print}если его значение равно true (не нулю).

Внутри брекетов {{!a[$1]++}}находитсядействиечто оценивается безусловно без побочных эффектов. Уберите скобки:

#!/bin/awk -f

BEGIN {
    FS=","
}

!a[$1]++

решение2

@steeldriver's awk ответэто правильно и, вероятно, это все, что вам нужно, но если ваши входные данные станут большими, они могут исчерпать память и/или работать относительно медленно, и в этом случае следующий подход декорирования/сортировки/декорирования будет работать и дальше:

nl -w1 -s, file |       # Decorate by prefixing with line numbers
sort -ut, -k2,2 |       # Sort uniquely by the real key field
sort -nt, -k1,1 |       # Sort whats left by the line numbers we added
cut -d, -f2-            # Undecorate by removing the line numbers

Связанный контент