gpt4 book ai didi

linux - 列中出现整数 - 添加为新列

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:00 27 4
gpt4 key购买 nike

我有一个包含 6 列的表格文件。我需要做的是添加第 7 列来计算第 3 列中值的出现次数。我是用 Excel 完成的,添加了公式

=countif(C:C,$C1)

但是文件很大,我有很多

例如:

我的输入是这个:

0   SL3.0ch03   7675648 21M GATCACTCCAAACTCATCATA   NM:i:2
0 SL3.0ch03 7675648 21M GATCACTCCAAACTCATCATA NM:i:2
0 SL3.0ch03 7675648 21M GATCACTCCAAACTCATCATA NM:i:2
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1
0 SL3.0ch03 7675649 21M CTCACTCCAAACTCATCATAC NM:i:2
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1

我需要这样的输出:

0   SL3.0ch03   7675648 21M GATCACTCCAAACTCATCATA   NM:i:2  3
0 SL3.0ch03 7675648 21M GATCACTCCAAACTCATCATA NM:i:2 3
0 SL3.0ch03 7675648 21M GATCACTCCAAACTCATCATA NM:i:2 3
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1 5
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1 5
0 SL3.0ch03 7675649 21M CTCACTCCAAACTCATCATAC NM:i:2 5
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1 5
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1 5
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1 4
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1 4
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1 4
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1 4

我已经尝试了一些我发现的东西:

awk '{h[$3]++}; END { for(k in h) print k, h[k] }' input.tab

这实际上显示了第 7 列,但不显示其余列。我还发现这段代码:

awk '{print $1,$2,$3,$4,$5,$6}'

打印所有列,所以我认为“这应该可行”:

awk '{print $1,$2,$3,$4,$5,$6,$7};{h[$3]++}; END { for(k in h) print k, h[k] }' input.tab > output.tab

但显然没有。我能做到的最好的事情是在文件底部打印所有 6 个原始列和我需要的输出,但我需要它作为第 7 列。

我熟悉基本的 shell 命令,但不熟悉 AWK 语言。

最佳答案

不幸的是,你必须读取文件两次才能工作,这取决于大小,效率可能非常低。

无论哪种方式,你都很接近:awk '{h[$3]++}; END { for(k in h) print k, h[k] }' input.tab正在 h[] 中构建 map ,以 $3 的值为键并存储它出现的次数,然后在读取所有行后,打印出该 map 。

你想要的是这样的:

awk 'FNR==NR{h[$3]++;next} {$7=h[$3]; print}' input.tab input.tab

第一次读取文件时,我们构建了 $3 的映射到它的计数,然后第二次读取(当 FNR!=NR 时)我们添加值为 $7,然后打印结果行。

例如

$awk 'FNR==NR{h[$3]++;next} {$7=h[$3]; print}' input.tab input.tab
0 SL3.0ch03 7675648 21M GATCACTCCAAACTCATCATA NM:i:2 3
0 SL3.0ch03 7675648 21M GATCACTCCAAACTCATCATA NM:i:2 3
0 SL3.0ch03 7675648 21M GATCACTCCAAACTCATCATA NM:i:2 3
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1 5
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1 5
0 SL3.0ch03 7675649 21M CTCACTCCAAACTCATCATAC NM:i:2 5
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1 5
0 SL3.0ch03 7675649 21M ATCACTCCAAACTCATCATAC NM:i:1 5
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1 4
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1 4
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1 4
0 SL3.0ch03 7675650 21M TCACTCCAAACTCATCATACT NM:i:1 4

此外,如果这些确实是制表符分隔的,您需要添加 BEGIN{FS=OFS="\t"} 以将分隔符和输出分隔符设置为制表符,因为它默认为空间如我上面的输出所示。

awk 'BEGIN{FS=OFS="\t"} FNR==NR{h[$3]++;next} {$7=h[$3]; print}' input.tab input.tab

关于linux - 列中出现整数 - 添加为新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49017613/

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