Dodaj listę wartości z kolumn A i B oddzielonych spacją i pokaż wynik sumowania [duplikat]

Dec 29 2020

Mam plik o nazwie fold.txt. Ma dwie wartości w każdym wierszu oddzielone spacją. Jeśli powiem, że pierwsza wartość reprezentuje kolumnę A, a druga wartość po spacji to kolumna B, to jak mogę dodać wszystkie wartości z kolumny A i wszystkie wartości z kolumny B i pokazać sumę każdej kolumny z osobna?

Spodziewam się czegoś takiego:

$ cat fold.txt
100 500
200 300
700 100

Wynik:

Total count Column A = 1000
Total count column B = 900

Odpowiedzi

5 αғsнιη Dec 29 2020 at 00:00

Z awk:

awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile

w języku awk , które jest narzędziem do przetwarzania tekstu, $1reprezentuje wartość pierwszej kolumny, $2przedstawia wartość drugiej kolumny, $3dla trzeciej itd., a jedna specjalna NFreprezentuje identyfikator ostatniej kolumny i odpowiednio $NFjest wartością ostatniej kolumny (więc można zastąpić $2powyżej z $NFtoo; i tak, łapiesz to, kiedy NFjest to ostatnia kolumna Id, więc wartość zmiennej mówi ci, ile masz kolumn (jej wartość jest aktualizowana dla każdej linii awk jest odczytywana z wejścia)).

Aby obsłużyć skrajny przypadek, w którym plik wejściowy jest pusty i nadal otrzymujemy numeryczne dane wyjściowe, dodajemy 0 do wyniku, zmuszając awkdo wyprowadzenia wyniku liczbowego.

kolumny (lub pola) w awkrozróżniane na podstawie FSzmiennej ( F eild S eparator), który domyślny jest zastosowanie miejsce / zakładkach. jeśli chcesz, aby kolumny były podzielone na inny znak, możesz przedefiniować to za pomocą -Fopcji awkjak w:

awk -F'<character-here>' '...' infile

lub w obrębie BEGIN{...}bloku jak z FS:

awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile

na przykład dla pliku wejściowego jak poniżej (teraz jest to przecinek zamiast spacji):

100,500
200,300
700,100

możesz napisać swój awkkod w następujący sposób:

awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile

Lub w obrębie BEGINbloku:

awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile

Trochę skomplikowane i podsumowanie wszystkich N kolumn pliku wejściowego na następującym przykładzie:

100,500,140,400
200,300,640,200
700,100,400,130

Więc rozmawialiśmy NFw pierwszym akapicie (wartość NF mówi ci, ile masz kolumn (aktualizacja na każdą linię)):

awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) { 
         printf ("Total count Column: %d= %d\n", colId, sum[colId] );
     };
}' infile

jedyną nową rzeczą jest to, że użyliśmy awktablicy do zaadresowania tego samego identyfikatora kolumny, pobierając z wartości ii dodając ich wartości $ido tej tablicy (indeks / klucze tej tablicy to identyfikatory kolumn); następnie w END{...}bloku pętlimy naszą tablicę na kluczach, które widzimy, a następnie wypisujemy najpierw identyfikator kolumny, a następnie sumę tych obok, zobaczysz wynik jak poniżej:

Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
ctac_ Dec 30 2020 at 01:56

To dobra robota dla DC.

dc czyta najpierw dane z fold.txt, a po kodzie z sum_col_dc.

Użyj tego w ten sposób: dc fold.txt sum_col_dc

cat sum_col_dc  

[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx  

Trochę więcej szczegółów:

[lB+sBlA+sAz0<C]sC  
[lGLElDnnnp]sH  
[Total count Column ]sD  
[B]sE  
[A]SE  
[ = ]sG  
lCx  
lA  
lHx  
lB  
lHx  

Ciesz się dc
Więcej wyjaśnień na żądanie.