从多个不同的文件中添加列值

时间:2017-03-24 16:14:06

标签: bash awk

我有~100个文件,我想在文件的第二列上进行算术运算(例如总结),这样我就将一个文件的第一行的值添加到第二行的第二行值文件等等,用于每个文件中第2列的所有行。

在我的实际文件中,我有大约30 000行,因此无法对行进行任何类型的手动操作。

的fileA

1   1  
2   100  
3   1000  
4   15000   

fileB

1   7  
2   500  
3   6000    
4   20000  

fileC

1   4  
2   300  
3   8000    
4   70000

输出:

1   12  
2   900  
3   15000  
4   105000  

我使用了它并将其运行为:script.sh listofnames.txt(所有文件都具有相同的名称,但它们位于不同的目录中,所以我用$line将它们引用到包含目录列表的文件中名)。这给了我一个语法错误,我正在寻找一种方法来定义" sum"否则。

while IFS='' read -r line || [[ -n "$line" ]]; do
    awk '{"'$sum'"+=$3; print $1,$2,"'$sum'"}' ../$line/file.txt >> output.txt
    echo $sum
done < "$1"

1 个答案:

答案 0 :(得分:2)

$ paste fileA fileB fileC | awk '{sum=0; for (i=2;i<=NF;i+=2) sum+=$i; print $1, sum}'
1 12
2 900
3 15000
4 105000

或者如果你想在awk中完成所有操作:

$ awk '{key[FNR]=$1; sum[FNR]+=$2} END{for (i=1; i<=FNR;i++) print key[i], sum[i]}' fileA fileB fileC
1 12
2 900
3 15000
4 105000

如果你有一个名为&#34; foo&#34;的文件中的目录列表并且您在每个目录中感兴趣的每个文件都被命名为&#34; bar&#34;那么你可以这样做:

IFS=$'\n' files=( $(awk '{print $0 "/bar"}' foo) )
cmd "${files[@]}"

其中cmd是awk或粘贴或您想要在这些文件上运行的任何其他内容。看:

$ cat foo
abc
def
ghi klm

$ IFS=$'\n' files=( $(awk '{print $0 "/bar"}' foo) )

$ awk 'BEGIN{ for (i=1;i<ARGC;i++) print "<" ARGV[i] ">"; exit}' "${files[@]}"
<abc/bar>
<def/bar>
<ghi klm/bar>

因此,如果您的文件都名为file.txt且您的目录名称存储在listofnames.txt中,那么您的脚本将是:

IFS=$'\n' files=( $(awk '{print $0 "/file.txt"}' listofnames.txt) )

然后是您喜欢的任何一种:

paste "${files[@]}" | awk '{sum=0; for (i=2;i<=NF;i+=2) sum+=$i; print $1, sum}'

awk '{key[FNR]=$1; sum[FNR]+=$2} END{for (i=1; i<=FNR;i++) print key[i], sum[i]}' "${files[@]}"