Zsumuj określoną kolumnę i weź unikalny rekord innej, używając tylko AWK

1

Mam plik wejściowy podobny do następującego:

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

Chcę zsumować wartość samej kolumny 6, aw czwartej, piątej, dziewiątej i dziesiątej kolumnie chcę usunąć duplikat i wydrukować pojedynczą wartość jako PLi 2175.

19 | 17 | 1 | {usuń duplikat i jedną wartość} | {usuń duplikat i jedną wartość} | {suma tutaj} |{suma tutaj} | {suma tutaj} | {usuń duplikat } | {usuń duplikat}

Próbowałem następujące:

grep 0000000089181 plik wejściowy | 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 }'

Bharath
źródło
1
Zakładając, że kolumny są oddzielone „|”, można to łatwo zrobić; ale trudno mi dopasować opis celu do danych: kolumna 6 nie jest liczbą; dodajesz także kolumnę 5, a następnie dzielisz dla pewnej średniej; i nie rozumiem, w jaki sposób twoje cele generują wynik 3 col + | es na końcu. Czy możesz spróbować wyjaśnić ponownie?
gnometorule
Moje złe: 6 jest liczbowe, ale 5, które też sumujesz, nie jest.
gnometorule 30.09.13
Więc co chcesz podsumować? Tylko numeryczna część 6? Tylko 14,5? Proszę edytować swoje pytanie i obejmują rzeczywiste Przykâadowa. Jaka jest suma, którą chcesz w każdej kolumnie? Suma tej kolumny w całym pliku?
terdon
Proszę wyjaśnić swoje pytanie. Na przykład mówisz: „Chcę zsumować samą wartość kolumny 6”, ale pokazujesz także sumowanie kolumn 7 i 8. W innym przykładzie każda wartość w kolumnie 1 zaczyna się od0111, każda wartość w kolumnie 2 jest1774, każda wartość w kolumnie 3 zaczyna się0000000i tak dalej. To sprawia, że ​​bardzo trudno jest spojrzeć na wartości i zobaczyć, które z nich są takie same, a które inne. Próbowałem usunąć niepotrzebne powielanie, pozostawiając tylko niezbędne dane. Sprawdź, czy nie uszkodziłem pytania.
Scott
Cześć gnometorule / terdon / scott- Dziękuję bardzo za szybkie odpowiedzi. Próbowałem wczoraj i otrzymałem odpowiedź zgodnie z oczekiwaniami. PAsting the odpowiedź poniżej
Bharath

Odpowiedzi:

0

To, czego dokładnie chcesz, jest dla mnie niejasne; ale poniższy kod odnosi się do czegoś, co wydaje się mieć na myśli. Sumuje wszystkie wartości; i przechowuje tylko (drukuje) rekordy, które są unikalne w odniesieniu do wszystkich kols 4, 5, 9 i 10, w którym to przypadku pierwszy taki rekord jest widoczny. Kolumny są drukowane 1, 2, 3, 9, 10, 6, 7, 8. Może możesz to dostosować dokładnie do tego, czego chcesz, lub podać dalsze informacje. P / o jest nieposortowane; jeśli chcesz posortować według, powiedzmy, kolumny 1, po prostu potokuj dane wyjściowe do sortowania. 

#!/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;
 }
gnometorule
źródło
0

właśnie próbowałem użyć uniq wewnątrz awk i zadziałało.

awk -F '|' „{column4 = uniq 4 $}; {coumn5 = uniq 5 $}; {coumn6 + = 6 $}; {column7 + = 7 $}; {column8 + = 8 USD}; {column9 = uniq 9 USD}; {coulmn10 = uniq 10 $} END {print column4 "|" kolumna5 „|” kolumna 6 „|” kolumna7 „|” kolumna8 „|” kolumna9 „|” column10} ”

Bharath
źródło