总结另一列中每个唯一项的一列数字

时间:2014-05-05 05:35:51

标签: file-io awk sed

我在Linux中有一个文件。对于第一列中的每个唯一标题,我必须总结第一列中具有标题的所有第四列的值,并在最后输出这两列。例如:

AF116642    792 t   1   ^!. ]
AF116642    793 g   2   .   ]
AF116643    794 t   5   .   ]
AF116643    795 g   6   .   ]
AF116643    796 t   3   .   ]
AF116644    797 g   1   .   ]
AF116644    798 t   8   .   ]
AF116644    799 g   1   .   ]

理想情况下会产生:

AF116642   3
AF116643   14
AF116644   10

输入文件的第一列中的相同名称是连续的,并且它们的顺序应该在输出文件中切换。我只有sed和awk知识片段,并且不能将它们拼凑起来执行此操作...

2 个答案:

答案 0 :(得分:1)

使用名为books,的文件中的数据,可以添加每本书的编号并按如下方式打印:

$ awk '{n[$1]+=$4} END{for (b in n) {print b,n[b]}}' books
AF116642 3
AF116643 14
AF116644 10

在上面的代码中,n是一个关联数组。键是书名。每当我们遇到一行时,第四列中的数字(表示为$4)就会添加到其图书的总数n[$1]中,其中$1是该图书的名称。第一栏。

答案 1 :(得分:0)

要保留您可以执行的订单:

awk '
$1!=prev && NR>1 {
    print prev, sum;
    sum = 0;
}
{
    prev = $1;
    sum += $4
}
END {
    print prev,sum
}' file
AF116642 3
AF116643 14
AF116644 10
  • 我们创建一个变量prev并为其指定第1列的值和另一个我们添加第4列的变量sum
  • 如果第1列与prev变量不匹配且行号大于1,我们打印变量并求和并将总和重置为0.
  • END块中,我们打印了变量的最后已知值。

注意:使用关联数组很好,但保留输出顺序。由于您已声明文件中的第一列是连续的,因此这种方法可行。