LINUX.ORG.RU

Bash задачка


0

0

Bash задачка Помогите, пожалуйста, не знаю как cделать скрипт на bash, который бы суммировал ряды и столбцы таблицы. Количество столбцов и рядов нужно определить из таблицы(из файла), в результате выдать исходную таблицу вместе с дополнительным рядом и стотлбцом сумм. Пример:

N:\\>vy4isli.sh data.dat 1 2 3 6 2 2 3 7 3 4 6

Заранее спасибо,

anonymous

1 2 3 6

2 2 3 7

3 4 6

anonymous
()

smeea@zerg:~/tmp$ cat data 
1 2 3 6
2 2 3 7
3 4 6 0
smeea@zerg:~/tmp$ cat tabl 
#!/bin/bash
echo `
awk '{ for (i = 1; i <= NF ; i++) s[i] += $i }
END { for (i = 1; i <= NF ; i++) print s[i] }' $1
` >> data
smeea@zerg:~/tmp$ ./tabl data 
smeea@zerg:~/tmp$ cat data 
1 2 3 6
2 2 3 7
3 4 6 0
6 8 12 13

Не полное решение, но чем богаты...

Smeea
()

perl, php или python напряги. Не стоит лобзиком пилить дрова, у него другие задачи.

KRoN73 ★★★★★
()

[ed__ed@localhost ~]$ cat data.t 1 2 3 6
2 2 3 7
3 4 6 0
[ed__ed@localhost ~]$ cat data.t | awk '{ row=0; for(i=1; i<=NF; i++){ col[i]+=$i; row+=$i;} print $0" "row} END { column=col[1]; for(i=2; i<=NF; i++){ column=column" "col[i];} print column}'
1 2 3 6 12
2 2 3 7 14
3 4 6 0 13
6 8 12 13

ed__ed
()
Ответ на: комментарий от KRoN73

>perl, php или python напряги. Не стоит лобзиком пилить дрова, у него другие задачи.

Ой, ну не смеши..

anonymous
()

Можно, например, так:

$ cat d.sh
#!/bin/sh
IFS=$'\n'; for ROW in `cat -`; do
        IFS=$' \t'; COLIDX=1; ROWSUM=0;
        for FIELD in `echo $ROW`; do
                ROWSUM=$(( ${ROWSUM} + ${FIELD} ));
                COLSUM[ ${COLIDX} ]=$(( ${COLSUM[ $COLIDX ] } + ${FIELD} ));
                COLIDX=$(( ${COLIDX} + 1));
        done
        echo -e "$ROW\t$ROWSUM"
done
for SUM in ${COLSUM[*]}; do echo -ne "$SUM\t"; done; echo
$ cat d.test
1       2       3
4       5       6
7       8       9
$ ./d.sh < d.test
1       2       3       6
4       5       6       15
7       8       9       24
12      15      18      

Но на перле было бы проще :)

anonymous
()
Ответ на: комментарий от ed__ed

> а чем на перле проще? разве что меньше скобок будет :)

Писать проще. Все-таки perl для работы с текстом лучше подходит. 
Не придется думать, где какой extension сработает, как задать
\n и \t в выводе и переменных, где держать суммы столбцов и т.д.

Ну и код на перле мне больше нравится :)

#!/usr/bin/perl
my @colsum;
foreach (<>) { chomp; print;
        my ($rowsum,$colidx) = (0,0);
        foreach (split) { $rowsum += $_; $colsum[$colidx++] += $_; }
        print "\t$rowsum\n";
}
foreach (@colsum) { print "$_\t"; } print "\n";

anonymous
()

Spasibo ogromnoe vsem za pomow :)

U menja takoj variant polu4ilsja

while read rida; do rsum="0" vnu="1" # veeru numbri jaoks for liige in $rida; do rsum=$((rsum + liige)) echo -n "$liige " vsum[$vnu]=$((vsum[vnu] + liige)) #vsum veergude summade masiiv vnu=$((vnu + 1)) # votame jargmise veergu done echo "$rsum " done

echo ${vsum[*]} #valjastame veergude summad - moodustavad viimast rida

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.