我在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知识片段,并且不能将它们拼凑起来执行此操作...
答案 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
。prev
变量不匹配且行号大于1,我们打印变量并求和并将总和重置为0. END
块中,我们打印了变量的最后已知值。 注意:使用关联数组很好,但不保留输出顺序。由于您已声明文件中的第一列是连续的,因此这种方法可行。