汇总多个文件中的列的脚本

时间:2019-02-12 13:28:34

标签: bash shell awk scripting

File A
Sector A    100
Sector B    200
Sector C    300
Sector D    500


File B
Sector A    100
Sector B    200
Sector C    300
Sector D    500


File C
Sector A    100
Sector B    200
Sector C    300
Sector D    500

我想得到一个文件,该文件的所有文件的扇区A,B,C的总和。

最终结果

Sector A    300
Sector B    600
Sector C    900
Sector D    1500

Shell脚本会很棒!!!您的建议受到赞赏。

5 个答案:

答案 0 :(得分:2)

请您尝试以下。

awk '{a[$1 FS $2]+=$NF} END{for(i in a){print i,a[i]}}' fileA fileB fileC

输出如下。

Sector A 300
Sector B 600
Sector C 900
Sector D 1500

答案 1 :(得分:1)

假设您的列由制表符分隔,则可以使用GNU datamash:

sort fileA fileB fileC | datamash groupby 1 sum 2

输出

Sector A    300
Sector B    600
Sector C    900
Sector D    1500

如果您的(可能是很大的)单个输入文件已经排序,则可以使用sort -m ...而不是sort来加快处理过程。

答案 2 :(得分:0)

不是最聪明的解决方案,但非常简单易懂:

person['surname'] = 'Baz';

答案 3 :(得分:0)

1 sort协助awk

$  sort filea.txt fileb.txt  filec.txt | awk ' { c=$2; if(c!=p && NR>1 ) { print $1,p,s;s=0} p=c;s+=$3 } END { print $1,p,s } '
Sector A 300
Sector B 600
Sector C 900
Sector D 1500
$

2。paste协助awk

$ paste filea.txt fileb.txt  filec.txt | awk ' { for(i=3;i<=NF;i+=3) s+=$i; print $1,$2,s ; s=0 } '
Sector A 300
Sector B 600
Sector C 900
Sector D 1500
$

答案 4 :(得分:0)

使用Perl,

$ perl -0777 -ne ' s/^(.+) (\d+)$/$kv{$1}+=$2/gme; END { for(sort keys %kv) { print "$_ $kv{$_}\n" }} ' filea.txt fileb.txt  filec.txt
Sector A    300
Sector B    600
Sector C    900
Sector D    1500
$