W pliku z różną liczbą kolumn rozdzielonych spacją '', Jak policzyć sumę kolumn. Przykład pokazuje potrzebę:
File A:
1 2
2 3
4 5 6
1 1 1 5
Wówczas wynik będzie:
- dla kolumny 1 (1 + 2 + 4 + 1) = 8
- dla kolumny 2 jest 11
- dla kolumny 3 jest 7
- dla kolumny 4 jest 5
command-line
scripts
Maythux
źródło
źródło
Użyj
numsum
do tego zadania i oddziel przetwarzanie danych od wyników.Zainstaluj
num-utils
, potrzebujemynumsum
I zacznij od
Przykład
lub w wybranym formacie:
od
man numsum
przykłady z
man numsum
źródło
źródło
(( col1 += a ))
, itp. Równieżecho "..."
jest bezpieczniejszy, a takżewhile IFS= read -r ...
echo
można bezpiecznie używać w ten sposób do echa liczb,$IFS
domyślnie w białych znakach i te powinny być liczbami, więc nie trzeba zajmować się odwrotnymi ukośnikami. Jedynym minusem tej odpowiedzi jest potrzeba znajomości liczby kolumn przed wykonaniem.echo "[...]"
do prawidłowego drukowania tego, czego nie chcesz wyświetlać, nie ma sensu.echo $var
iwhile read a b c
, to działa tutaj. Jednak przyzwyczaisz się do pisania go słabo i pewnego dnia wystąpią dziwne błędy podczas przetwarzania bardziej złożonego pliku. Wtedy zauważysz, że cytowanie zmiennych i używaniewhile IFS= read -r ...
było bezpieczniejsze i powiesz: „o tak, fedorqui miał rację, mam nadzieję, że mógłbym go mieć i przytulić, by okazać wdzięczność!”.Sądząc po komentarzach do własnej odpowiedzi, chcesz tylko sumę jednej kolumny na raz. Jeśli tak, oto nie-awk sposób, aby to zrobić:
gdzie zastąpiłbyś
3
numer kolumny, którą jesteś zainteresowany.źródło
Oto jednoliniowe podejście do skryptu Perl. Zależy to od użycia
-a
flagi, która umożliwia automatyczne dzielenie aktualnie czytanej linii z-n
flagą na tablicę@F
. Wszystko, co musimy zrobić, to iterować te elementy i dodawać je do odpowiedniego indeksu w$sum
tablicy, a zatem każdy element tablicy jest sumą dla każdej odpowiedniej kolumny. Na koniec wypisujemy wynik wEND
bloku kodu.Alternatywnie, oto pełne podejście do skryptu Perla. Polega na podzieleniu każdej linii na tablicę i iteracji po każdym elemencie w tej tablicy, dodając każdą liczbę do odpowiedniej pozycji w
@sums
tablicy. Skrypt drukuje każdą linię, a następnie generuje raport dla każdej kolumny. Drukowanie każdej linii można usunąć, dodając#
wcześniejprintf("%s",$line);
Użycie jest proste
chmod +x ./sum_columns.pl && ./sum_columns.pl input.txt
. Na przykład:źródło
Proste rozwiązanie:
Zamień i na numer kolumny, na przykład kolumna 1:
wyjście to:
źródło