Bash 用于对多个文件中的列求和的脚本

Bash 用于对多个文件中的列求和的脚本,bash,shell,awk,scripting,Bash,Shell,Awk,Scripting,我想得到一个文件,它包含所有文件的扇区A,B,C的总和 最终结果 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的总和

最终结果

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

Shell脚本将是伟大的!!!非常感谢您的建议。

请尝试以下内容

Sector A    300
Sector B    600
Sector C    900
Sector D    1500
输出如下

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

假设列由选项卡分隔,则可以使用GNU datamash:

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

sort fileA fileB fileC | datamash groupby 1 sum 2

如果您(可能较大)的单个输入文件已经排序,您可以使用
sort-m…
而不是
sort
,来加快排序过程,这不是最聪明的解决方案,但非常简单易懂:

Sector A    300
Sector B    600
Sector C    900
Sector D    1500
用于文件A文件B文件C中的f
做
读行时
做
A=$(echo$行| grep“扇区A”| tr-s“| cut-d”—f3)
B=$(echo$行| grep“扇区B”| tr-s“| cut-d”—f3)
C=$(echo$行| grep“扇区C”| tr-s“| cut-d”—f3)
D=$(echo$行| grep“扇区D”| tr-s“| cut-D”-f3)
secA=$((secA+A))
secB=$((secB+B))
secC=$((secC+C))
secD=$((secD+D))
完成<$f
完成
echo“A区”$secA
回声“B区”$secB
回声“C区”$secC
回声“D区”$secD

1
sort
assisted
awk

for f in fileA fileB fileC
do
   while read line
   do
   A=$(echo $line | grep "Sector A" | tr -s " "| cut -d' ' -f3)
   B=$(echo $line | grep "Sector B" | tr -s " "| cut -d' ' -f3)
   C=$(echo $line | grep "Sector C" | tr -s " "| cut -d' ' -f3)
   D=$(echo $line | grep "Sector D" | tr -s " "| cut -d' ' -f3)
   secA=$((secA+A))
   secB=$((secB+B))
   secC=$((secC+C))
   secD=$((secD+D))
   done < $f
done
echo "Sector A" $secA
echo "Sector B" $secB
echo "Sector C" $secC
echo "Sector D" $secD
$  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.
粘贴
辅助
awk

for f in fileA fileB fileC
do
   while read line
   do
   A=$(echo $line | grep "Sector A" | tr -s " "| cut -d' ' -f3)
   B=$(echo $line | grep "Sector B" | tr -s " "| cut -d' ' -f3)
   C=$(echo $line | grep "Sector C" | tr -s " "| cut -d' ' -f3)
   D=$(echo $line | grep "Sector D" | tr -s " "| cut -d' ' -f3)
   secA=$((secA+A))
   secB=$((secB+B))
   secC=$((secC+C))
   secD=$((secD+D))
   done < $f
done
echo "Sector A" $secA
echo "Sector B" $secB
echo "Sector C" $secC
echo "Sector D" $secD
$  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
$
$paste filea.txt fileb.txt filec.txt | awk'{for(i=3;i使用Perl

$ 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
$

你试过什么?PS:也许你是说“D区1500”如果你回答了你的问题,请接受这个答案。接受一个答案,关闭这个问题并奖励被接受的答案的作者。如果你的问题没有解决,考虑解释为什么。Hello Ravinder,非常感谢你的回答。我是新的脚本,所以请你写下这些步骤。这将有帮助。学习更快。另外,我有多个文件,如果它们被任意空格分隔,我可以在命令末尾使用通配符(*)添加
-W
。@Shawn不幸的是,这并不容易。
扇区A
也包含一个空格。如果您知道第一列始终只包含一个空格(对于OP的示例输入)然后我们可以使用
datamash-wgroupby 1,2sum 3
。如果第一个“列”可以是任何内容,那么我们就丢失了,但这是一个一般性问题,不特定于
datamash