
Meu arquivo de dados de entrada é assim
Town,Code1,Code2,Code3,Code4
Oxford,X532,X011,X989
Oxford,X532,X011
Hendon,X002,X011,X222,X769
Preciso da saída para listar as cidades com código associado, assim
Oxford,X532,1,Prim
Oxford,X011,2,Secd
Oxford,X989,3,Secd
Oxford,X532,1,Prim
Oxford,X001,2,Secd
Hendon,X002,1,Prim
Hendon,X011,2,Secd
Hendon,X222,3,Secd
Hendon,X769,4,Secd
No entanto, também preciso resumir onde estão os códigos que aparecem na mesma posição para que o acima fique mais parecido com este
Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Oxford,X989,3,Secd,1
Oxford,X532,1,Prim,2
Oxford,X001,2,Secd,1
Hendon,X002,1,Prim,1
Hendon,X011,2,Secd,1
Hendon,X222,3,Secd,1
Hendon,X769,4,Secd,1
Atualmente, o AWK que escrevi faz a maior parte do que desejo, mas claramente preciso criar um array para armazenar onde os mesmos códigos estão presentes na mesma posição para a contagem na saída - meu AWK como está é
FS=","
OFS=","
}
{
site=$1
code[1]=$2
code[2]=$3
code[3]=$4
code[4]=$5
key=site
for (i=1; i<=4; ++i) {
cnt=i
++recs[i]
posn=""
if (cnt==1) {posn="Prim"}
else {posn="Secd"}
if (code[i] !="") {print key,code[i], cnt, posn}
}
}
Como posso finalizar este AWK para produzir a saída correta? não tenho certeza se preciso de uma seção END etc.
Responder1
Tente isso,
awk -F ',' '{for (i=2;i<=NF;i++) { if (i==2) {print $1","$i","i-1",""Prim"} else print $1","$i","i-1",""Secd"}}' file
Oxford,X532,1,Prim
Oxford,X011,2,Secd
Oxford,X989,3,Secd
Oxford,X532,1,Prim
Oxford,X001,2,Secd
Hendon,X002,1,Prim
Hendon,X011,2,Secd
Hendon,X222,3,Secd
Hendon,X769,4,Secd
Para resumir onde estão os códigos que aparecem na mesma posição
ARRAY=(`awk -F ',' '{for (i=2;i<=NF;i++) { if (i==2) {print $1","$i","i-1",""Prim"} else print $1","$i","i-1",""Secd"}}' file`)
for i in ${ARRAY[@]}
do
PATTERN=`echo $i | awk -F ',' '{print $2}'`
COUNT=`echo "${ARRAY[@]}"| tr ' ' '\n' | grep -c $PATTERN `
echo "$i,$COUNT"
done
Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Oxford,X989,3,Secd,1
Oxford,X532,1,Prim,2
Oxford,X001,2,Secd,1
Hendon,X002,1,Prim,1
Hendon,X011,2,Secd,2
Hendon,X222,3,Secd,1
Hendon,X769,4,Secd,1
Responder2
Eu processaria o arquivo de entrada duas vezes: uma vez para contar as ocorrências de pares cidade+código, uma vez para gerar o relatório:
awk -F, -v OFS=, '
FNR == 1 {next}
NR == FNR {
for (i=2; i <= NF; i++)
count[$1,$i]++
next
}
{
for (i=2; i <= NF; i++)
print $1, \
$i, \
(i-1), \
(i == 2 ? "Prim" : "Secd"), \
count[$1,$i]
}
' file file
Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Oxford,X989,3,Secd,1
Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Hendon,X002,1,Prim,1
Hendon,X011,2,Secd,1
Hendon,X222,3,Secd,1
Hendon,X769,4,Secd,1
Responder3
BEGIN {
FS=","
OFS=","
}
{
site=$1
code[1]=$2
code[2]=$3
code[3]=$4
code[4]=$5
key=site
for (i=1; i<=4; ++i) {
cnt=i
++recs[i]
posn=""
if (cnt==1) {posn="Prim"}
else {posn="Secd"}
if (code[i] !="") { myarr[key","code[i]"," posn]++}
}
}
END{
for (i in myarr) {print i","myarr[i]}
}
Resultados:
Hendon,X002,Prim,1
Hendon,X769,Secd,1
Oxford,X011,Secd,2
Hendon,X222,Secd,1
Oxford,X532,Prim,2
Hendon,X011,Secd,1
Oxford,X989,Secd,1