如何通过唯一的前3列和平均第4列合并n个制表符分隔的文件?

时间:2018-12-18 18:45:39

标签: bash

我一直在寻找一种更简单的方法来合并和平均n(n <10)个制表符分隔的文件,然后对其中两个使用android:allowBackup="false" ,然后join删除重复的列,然后最终以n列进行平均。如果您可以推荐合适的资料来阅读,我很乐意做更多的“作业”。谢谢!

说我有awk表,格式为N

tableN1

我处理此问题的唯一方法是使用(这可能不是正确的方法):

c1 650 651 3e-07
c2 550 440 2e-04

tableN2

c1 650 651 2.8e-07
c2 550 440 2.1e-04

..

tableNi

c1 650 651 2.9e-07
c2 550 440 2.2e-04

2 个答案:

答案 0 :(得分:1)

由于要连接的列始终相同,因此可以使用paste代替joinpaste可以一次加入两个以上的文件。

paste table1 table2 ... tableN | awk '{ print $1,$2,$3,($4+$8+...+$N*4)/N }'

这仍然需要手动修改awk命令。您可以在awk中使用循环来解决此问题。

paste table1 table2 ... |
awk '{ avg=0; for (i=4; i<=NF; i+=4) avg+=$i; print $1,$2,$3,avg*4/NF }'

答案 1 :(得分:1)

使用gnu awk的单个命令可能对您有用:

awk 'BEGIN{FS=OFS="\t"} FNR == NR{
   a[$1] = 1
   for (i=2; i<=NF; i++)
      s[$1][i] = $i
   next
}
a[$1] {
   for (i=2; i<=NF; i++)
      s[$1][i] += $i
}
END {
   for (i in a) {
      r = i
      for (j=2; j<=NF; j++)
         r = sprintf("%s%s" (j == NF ? "%.2e" : "%d"), r, OFS, s[i][j]/(ARGC-1))
      print r
   }
}' tableN*

c1  650 651 2.90e-07
c2  550 440 2.05e-04