Linux命令行

时间:2017-12-13 15:52:06

标签: linux bash

我有很多制表符分隔的文件,其中的行格式如下:

...
some_str\tsome_str\tsome_str\tsome_str\tsome_int
some_str\tsome_str\tsome_str\tsome_str\tsome_int
...

前四列在所有列中都相同,但最后一列因文件而异。有没有一种简单的方法可以在bash中创建一个文件,前四列是相同的,最后一列是所有文件的最后一列的总和?像:

...
some_str\tsome_str\tsome_str\tsome_str\tsum_of_that_value_in_all_files
some_str\tsome_str\tsome_str\tsome_str\tsum_of_that_value_in_all_files
...

如果可能的话,我正在寻找一个简单的单行内容。

2 个答案:

答案 0 :(得分:2)

是的,awk可以做到:

awk -F'\t' -v OFS='\t' '{a[$1 FS $2 FS $3 FS $4]+=$5}
   END{for(x in a)print x,a[x]}' *.tsv (or other patterns for all your files)

该命令未经过测试,但我认为应该进行测试。如果要将结果保存到其他文件,只需在末尾添加> newFile

答案 1 :(得分:1)

类似awk,但未修复列数

$ awk '    {k=$NF; sub(k"$",""); sum[$0]+=k} 
       END {for(k in sum) print k,sum[k]}' files

记录的顺序可能不会被保留,但也不受任何文件中键的顺序的影响。