Mam duży plik w następującym formacie:
2 1019 0 12
2 1019 3 0
2 1021 0 2
2 1021 2 0
2 1022 4 5
2 1030 0 1
2 1030 5 0
2 1031 4 4
Jeśli wartości w kolumnie 2 są zgodne, chcę zsumować wartości w kolumnie 3 i 4 obu wierszy, w przeciwnym razie tylko suma wartości w unikalnym wierszu.
Tak więc wynik, na który mam nadzieję, wygląda następująco:
2 1019 15
2 1021 4
2 1022 9
2 1030 6
2 1031 8
Jestem w stanie posortować pliki według kolumny 2 za pomocą awk
lub sort
i zsumować ostatnie kolumny awk
, ale tylko dla pojedynczych linii, a nie dla dwóch linii, w których kolumna 2 pasuje.
text-processing
awk
sort
uniq
TomPio
źródło
źródło
$1 $2
jako klucz.Odpowiedzi:
Zrobiłbym to w Perlu:
Lub awk:
Jeśli chcesz posortować dane wyjściowe według drugiej kolumny, możesz po prostu potokować do
sort
:Pamiętaj, że oba rozwiązania obejmują również pierwszą kolumnę. Ideą jest użycie pierwszej i drugiej kolumny jako kluczy do skrótu (w perlu) lub tablicy asocjacyjnej (w awk). Klucz w każdym rozwiązaniu jest
column1 column2
taki, że jeśli dwa wiersze mają tę samą kolumnę drugą, ale inną kolumnę jedną, zostaną one zgrupowane osobno:źródło
Może to może pomóc, ale czy kolumna 1 jest zawsze 2 i czy od tego zależą wyniki?
lub jak wspomniał glenn jackman w komentarzach na temat sortowania:
źródło
PROCINFO["sorted_in"] = "@ind_num_asc"
zamiast potokowania dosort
. ref gnu.org/software/gawk/manual/html_node/…Możesz wstępnie posortować dane i pozwolić awk zająć się szczegółami:
Możesz zresetować akumulator:
Wynik:
Jeśli naprawdę chcesz zachować pierwszą kolumnę, zrób coś takiego:
Wynik:
Wyjaśnienie
p
Zmienna posiada$2
wartość poprzedniej linii, albo$1FS$2
w drugim przypadku powyżej. Oznacza to, że{print p,s}
wyzwalane jest, gdy$2
poprzednia linia nie jest taka sama jak ta w bieżącej linii (p!=$2
).źródło
sort -k2
do sortowania według drugiej kolumnyKorzystanie szwajcarski scyzoryk util
mlr
:Wynik:
Uwagi:
--nidx
każemlr
używać nazw pól numerycznych.put '$5=$3+$4'
tworzy nowe 5. pole, sumę pól 3 i 4 .stats1
Funkcja (lub „ czasownik ”) jest mniejsza armii szwajcarskiejw większej Swiss army nóż
mlr
z kilku funkcji, takich jak na bazie akumulatorówsum
,count
,mean
, etc.stats1 -g 1,2
grupuje dane według kolumn 1 i 2 , a-f 5 -a sum
następnie sumuje pole tych grup 5 .stats1
drukuje tylko nazwane pola.źródło