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