Algo como isso deve funcionar:
awk -F";" '!seen[$1]++{print}END {for (i in seen) if (seen[i]>1) print i,"found :" seen[i] "times"}' file
A primeira parte antes de END não imprimirá duplicatas emulando uniq
. Isso significa que se uma entrada for encontrada duas ou mais vezes, somente a primeira entrada será impressa.
O código em END imprimirá todas as entradas encontradas mais de uma vez.
Se você precisar imprimir entradas únicas e únicas, emulando uniq -u
, o que significa que, se uma entrada for encontrada duas ou mais vezes, não será impressa, então você pode usar:
awk -F";" '{seen[$1]++}END {for (k=1;k<=2;k++) for (i in seen) if (seen[i]==1) {print i;delete seen[i];continue} else {print i,"found :" seen[i] "times"}}' file
Isso itera o array duas vezes. A primeira vez que as entradas true uniq serão impressas e a segunda vez que as entradas duplicadas serão impressas.
Alternativa:
awk -F";" '{seen[$1]++}END {for (i in seen) print "found :" seen[i] "times:",i}' file |sort
Isso imprimirá cada entrada junto com a contagem (entradas únicas serão encontradas uma vez, entradas não exclusivas serão encontradas mais de uma vez)