Soma uma coluna em particular e pega o registro único de outra usando somente AWK

1

Eu tenho um arquivo de entrada como o seguinte:

19 | 17 | 1 | 89 | C | 9 | 100 | 9 | PL | 2175
20 | 17 | 1 | 89 | C | 9 | 100 | 9 | PL | 2175
21 | 17 | 2 | 89 | C | 9 | 100 | 9 | PL | 2175
23 | 17 | 2 | 89 | C | 9 | 100 | 9 | PL | 2175
24 | 17 | 1 | 89 | C | 9 | 100 | 9 | PL | 2175
27 | 17 | 1 | 89 | C | 9 | 100 | 9 | PL | 2175

Quero somar o valor da coluna 6 sozinho e, nas colunas 4, 5, 9 e 10, quero remover a duplicata e imprimir um único valor como PL e 2175 .

19 | 17 | 1 | {remove duplicate and single value} | {remove duplicate and single value} | {sum here} |{sum here} | {sum here} | {remove duplicate} | {remove duplicate}

Eu tentei o seguinte:

grep 0000000089181 input file | awk -F'|' '
        { sum_p_all += $5} ;
        { sum_quantity += $6} ;
        { mean_p_unit = sum_p_all/sum_quantity} ;
        { sum_p_all2 = sum_p_all * 100} ;
        { mean_p_unit2 = mean_p_unit * 100}
END     { print sum_p_all2 " " sum_quantity " " mean_p_unit2 }'

    
por Bharath 30.09.2013 / 17:04

2 respostas

0

O que você quer exatamente, é até claro para mim; mas o código a seguir aborda algo nos moldes do que você parece ter em mente. Soma todos os valores; e somente mantém (imprime) registros que são únicos em relação a todos os arquivos 4, 5, 9 e 10, em cujo caso mantemos o primeiro registro visto. Os colos são impressos 1, 2, 3, 9, 10, 6, 7, 8. Talvez você possa ajustar isso exatamente ao que você quer, ou fornecer mais informações. O p / o é não classificado; se você quiser ordenar por, digamos, col 1, apenas canalize a saída em sort.

#!/usr/bin/awk - f
# or your system's location
BEGIN{
   FS=OFS="|";
   s6=s7=s8=0;
   t="";
   a[""]="";
   seen[""]=0;
}

{
   s6 += $6;
   s7 += $7;
   s8 += $8;

   t = $4 $5 $9 $10;
   seen[t]++;
   if (seen[t] == 1)
      a[t] = $1 "|" $2 "|" $3 "|" $9 "|" $10 "|" $6 "|" $7 "|" $8;
}

END{
   for (i in a)
      print a[i];
   print s6, s7, s8;
 }
    
por 30.09.2013 / 18:51
0

Eu apenas tentei usar o uniq dentro do awk e funcionou.

awk -F '|' '{column4 = uniq $ 4}; {coumn5 = uniq $ 5}; {coumn6 + = US $ 6}; {column7 + = US $ 7}; {column8 + = US $ 8}; {column9 = uniq $ 9}; {coulmn10 = uniq $ 10} END {print column4 "|" column5 "|" column6 "|" column7 "|" column8 "|" column9 "|" column10} '

    
por 01.10.2013 / 08:46

Tags