awk
é seu amigo
$ cat 299360
ipw1jc5ssyt6hx618,254343
ysezaratlycpuggl,254333
pht92h4adr3mrbz3,254343
hguvgstqxu3gowfg,254344
gqjp2rsjmk1a2v9c,254333
twdzyi2ddbnrfknd,254333
gcmj7krrx5x6nf8r,254341
tpqorqbyrg1nmm7s,254333
alnac47rt8d4ege3,254343
$ awk -v FS="," '/^$/{next} # for empty line go to next record
{if(NR==1){ # checking for first record
f2[$2]=$1;next} # Adding $1 to array f2 at index $2
else{
if($2 in f2){ # Check if $2 is already an index in f2
f2[$2]=f2[$2]"-"$1;next #appending "-$1" to current value
}
else{
f2[$2]=$1;next
}
}}
END{ # This line will be processed at the end
for(i in f2){ # for all the indexes i in f2
printf "%s,%s\n",i,f2[i] #printing in the desired format
}
}
' 299360
254341,gcmj7krrx5x6nf8r
254333,ysezaratlycpuggl-gqjp2rsjmk1a2v9c-twdzyi2ddbnrfknd-tpqorqbyrg1nmm7s
254343,pw1jc5ssyt6hx618-pht92h4adr3mrbz3-alnac47rt8d4ege3
254344,hguvgstqxu3gowfg
Explicação
-
FS=","
- FS é a variável interna do awk que significa separador de campo. Definir o separador de campo como,
definirá,
como o delimitador. - Você acessa os campos por
$1
,$2
e assim por diante. - O script awk é colocado entre aspas simples;
ou seja,
'awk-script-goes-here'
-
NR
é uma variável interna do awk que representa o número do registro (o número do registro sendo processado atualmente). Por padrão, cada linha é um registro. - Por
f2[$2]=$1
, estamos configurando uma matriz associativaf2
com campo2 (ou seja,$2
) como o índice. -
$2 in f2
verifica se o índice já está presente no array. - Os
if-else
eprintf
são auto-explicativos. - O bloco
END
no awk é executado apenas no final; ou seja, depois de todos os registros terem sido processados. -
for(i in f2)
é uma construção de forloop usada para analisar as matrizes associativas no awk. É a outra maneira de dizer,for every index i in f2 do something
- Observe que o loop
for
acima pode não imprimir a matriz em um pedido. Você pode usar o comandosort
bash para classificar a matriz. -
next
vai para o próximo registro sem processar os comandos a seguir. - O
/pattern/
verifica um padrão no awk; o padrão^$
verifica a linha vazia.
Referência
Se você deseja obter um especialista em awk, Programação eficaz do awk é um deve ler.
Um-liner feio
awk -v FS="," '/^$/{next}{if(NR==1){f2[$2]=$1;next}else{if($2 in f2){f2[$2]=f2[$2]"-"$1;next}else{f2[$2]=$1;next}}}END{for(i in f2){printf "%s,%s\n",i,f2[i]}}' 299360
Nota: Idealmente, não é uma boa ideia codificar novas linhas em scripts awk, como em printf "%s,%s\n",i,f2[i]
. Você pode substituí-lo por printf "%s,%s\n",i,f2[i];print
para portabilidade extra.