Поэтапное суммирование таблиц в сценарии оболочки linux - PullRequest
2 голосов
/ 08 декабря 2010

У меня есть набор таблиц в следующем формате:

1000 3 0 15 14
2000 3 0 7 13
3000 2 3 14 12
4000 3 1 11 14
5000 1 1 9 14
6000 3 1 13 11
7000 3 0 10 15

Они находятся в простых текстовых файлах.

Я хочу объединить эти файлы в новую таблицу в том же форматегде каждая ячейка (X, Y) является суммой всех ячеек (X, Y) из исходного набора таблиц.Немного усложняющим фактором является то, что числа из первого столбца не должны суммироваться, поскольку это метки.

Я подозреваю, что это можно сделать с помощью AWK, но я не особенно разбираюсь в этом языке и могунайти решение в Интернете.Если кто-то предлагает другой инструмент, это тоже хорошо.

Я хочу сделать это из сценария оболочки bash.

Ответы [ 3 ]

2 голосов
/ 08 декабря 2010

Попробуйте:

#!/usr/bin/awk -f
{
    for (i=2;i<=NF; i++)
        a[$1,i]+=$i
    b[$1]=$1
    if (NF>maxNF) maxNF=NF
}

END {
    n=asort(b,c)
    for (i=1; i<=n; i++) {
        printf "%s ", b[c[i]]
        for (j=2;j<=maxNF;j++) {
            printf "%d ", a[c[i],j]
        }
        print ""
    }
}

Запустите это так:

./sumcell.awk table1 table2 table3

или

./sumcell.awk table*

Вывод с использованием вашего примера ввода дважды будет выглядеть так:

$ ./sumcell.awk table1 table1
1000 6 0 30 28
2000 6 0 14 26
3000 4 6 28 24
4000 6 2 22 28
5000 2 2 18 28
6000 6 2 26 22
7000 6 0 20 30
1 голос
/ 09 декабря 2010
perl -anE'$h{$F[0]}[$_]+=$F[$_]for 1..4}{say$_,"@{$h{$_}}"for sort{$a<=>$b}keys%h' file_1 file_2
1 голос
/ 08 декабря 2010

Суммируйте каждую строку, предполагая по крайней мере один числовой столбец в каждой строке.

while read line ; do
    label=($line)
    printf ${label[0]}' ' ;
    expr $(
        printf "${label[1]}"
        for c in "${label[@]:2}" ; do
            printf ' + '$c
        done 
    )
done < table

РЕДАКТИРОВАТЬ: Конечно, я не видел комментарий о комбинировании на основе метки, так что это не полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...