buscar uma coluna de um arquivo baseado em outra coluna

1

Eu tenho um arquivo que contém aproximadamente 5 milhões de registros, como segue: -

1223423,21,foo,data1,data2,data3,data4,data5,45,267,index1
4234234,34,bar,cat1,cat2,cat3,cat4,cat5,34,2323,index2
325423,23,foo,data1,data2,data3,data4,data5,23,1232,index3
2131,23,bar,cat1,cat2,cat3,cat4,cat5,22,4334,index4
1231,43,cat,val1,val2val3,val4,val5,96,4598,index5
4596,87,cat,val1,val2val3,val4,val5,08,234,index6

Saída desejada:

foo,data1,data2,data3,data4,data5 : index1,index3
bar,cat1,cat2,cat3,cat4,cat5 : index2,index4
cat,val1,val2val3,val4,val5 : index5,index6
    
por anurag 24.08.2015 / 16:07

3 respostas

0

tente isso se funcionar

awk -F, '{a[$3$4$5$6$7$8]++;if(a[$3$4$5$6$7$8] > 1)k[$3$4$5$6$7$8]=k[$3$4$5$6$7$8]","$11;else k[$3$4$5$6$7$8]=$3","$4","$5","$6","$7","$8":"$11}'END'{for(i in k) print k[i]}' data

tenho dúvidas on line

4596,87,cat,val1,val2val3,val4,val5,08,234,index6

não há vírgula (,) entre val2val3 ?? isso correto ??

    
por 24.08.2015 / 16:28
0

Com arquivos muito grandes, geralmente é melhor classificar os dados para que o restante seja mais fácil e não precisa de nenhuma memória. A classificação foi projetada para lidar com conjuntos de dados muito grandes.

O seguinte remove as colunas indesejadas, classifica os dados e, em seguida, o awk apenas suprime as colunas duplicadas sem precisar lembrar mais de uma linha. A classificação final é opcional, para obter os índices em ordem.

cut -d, -f 3-8,11 |
sort |
awk -F, '
{ new = sprintf("%s,%s,%s,%s,%s,%s",$1,$2,$3,$4,$5,$6)
  if(new==last)printf ",%s",$7
  else{ printf "%s%s: %s",newline,new,$7
        last = new
        newline = "\n"
  }
}
END{printf "\n"}
' |
sort -t: -k 2
    
por 24.08.2015 / 17:23
0

Você pode usar awk para construir um array (na memória) enquanto lê o arquivo - então END-processa esse array para produzir conforme necessário.

No entanto, muitos campos permanecem depois de remover os primeiros 2 e os últimos 3 campos de um registro, tornando-se a chave para o array.

awk -F, '{ ix=$NF
           sub( "[^,]+,[^,]+,","")       # delete first 2 fields
           sub(",[^,]+,[^,]+,[^,]+$","") # delete last 3 fields
           a[$0]=a[$0] ","ix }  
      END{ for( r in a ) { sub(",","",a[r]);  print r" : "a[r] }
         }' file

saída:

cat,val1,val2val3,val4,val5 : index5,index6
bar,cat1,cat2,cat3,cat4,cat5 : index2,index4
foo,data1,data2,data3,data4,data5 : index1,index3
    
por 24.08.2015 / 16:54