gpt4 book ai didi

linux - 在 bash 中对没有 uniq 的列进行排序和计数

转载 作者:太空宇宙 更新时间:2023-11-04 05:01:44 24 4
gpt4 key购买 nike

我想使用 bash 仅添加第一列的计数,而不执行 uniq,如下所示:

输入:

58311s2727  NC_000082.6 100.00  50  
58311s2727 NC_000083.6 100.00 60
58311s2727 NC_000084.6 100.00 70
58310s2691 NC_000080.6 100.00 30
58310s2691 NC_000081.6 100.00 20
58308s2441 NC_000074.6 100.00 50

输出:

3  58311s2727   NC_000082.6 100.00  50  
3 58311s2727 NC_000083.6 100.00 60
3 58311s2727 NC_000084.6 100.00 70
2 58310s2691 NC_000080.6 100.00 30
2 58310s2691 NC_000081.6 100.00 20
1 58308s2441 NC_000074.6 100.00 50

我尝试过:

sort input.txt | cut -f1 | uniq -c

但是输出不是我想要的。我想知道是否有简单的方法可以解决这个问题。

最佳答案

对于排序输入,您可以简单地使用 awk,捕获具有相同键的行集,并在键更改时打印之前的行集。处理 EOF 有点困惑;你必须重复打印。您可以编写一个 awk 函数来执行打印,但对于这么简单的事情来说几乎是大材小用。

脚本.awk

$1 != old_key { if (n_keys > 0) for (i = 0; i < n_keys; i++) print n_keys, saved[i]; n_keys = 0 }
{ saved[n_keys++] = $0; old_key = $1 }
END { if (n_keys > 0) for (i = 0; i < n_keys; i++) print n_keys, saved[i] }

运行示例

对于示例输入input.txt(已分组),输出为:

$ awk -f script.awk input.txt
3 58311s2727 NC_000082.6 100.00 50
3 58311s2727 NC_000083.6 100.00 60
3 58311s2727 NC_000084.6 100.00 70
2 58310s2691 NC_000080.6 100.00 30
2 58310s2691 NC_000081.6 100.00 20
1 58308s2441 NC_000074.6 100.00 50
$

如果要排序,请先排序:

$ sort input.txt | awk -f script.awk
1 58308s2441 NC_000074.6 100.00 50
2 58310s2691 NC_000080.6 100.00 30
2 58310s2691 NC_000081.6 100.00 20
3 58311s2727 NC_000082.6 100.00 50
3 58311s2727 NC_000083.6 100.00 60
3 58311s2727 NC_000084.6 100.00 70
$

请注意,除其他优点外,这可以处理来自管道的数据,因为它不需要处理文件两次,这与目前接受的至少一种其他解决方案不同。它还只在内存中保留与公共(public) key 最大组中的行数相同的行数,因此即使相当大的文件也不会对系统上的内存造成压力。 (sort 可能比 awk 施加更多的内存负载。)

script2.awk

使用函数和一些空格,代码变为:

function dump_keys(    i) {
if (n_keys > 0)
{
for (i = 0; i < n_keys; i++)
print n_keys, saved[i]
}
n_keys = 0
}
$1 != old_key { dump_keys() }
{ saved[n_keys++] = $0; old_key = $1 }
END { dump_keys() }

变量i是函数的本地变量(awk的一个怪癖)。我可以简单地从参数列表中省略它,因为 i 在脚本的其他地方没有使用。

这会产生与 script.awk 相同的输出。

关于linux - 在 bash 中对没有 uniq 的列进行排序和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30575347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com