Design patterns AWK-计数和打印不同的图案
我有一个13列的文件。它看起来就像这样:Design patterns AWK-计数和打印不同的图案,design-patterns,awk,counting,Design Patterns,Awk,Counting,我有一个13列的文件。它看起来就像这样: M01562:52:000000000-A9Y4G:1:1101:10000:13082_1:N:0:1 gene_id_8535 100.00 254 0 0 1 254 302 49 3.2e-140 495.0 254 M01562:52:000000000-A9Y4G:1:1101:10000:18672_1:N:0:1 gene_id_118536 100.00 193 0 0 1 1
M01562:52:000000000-A9Y4G:1:1101:10000:13082_1:N:0:1 gene_id_8535 100.00 254 0 0 1 254 302 49 3.2e-140 495.0 254
M01562:52:000000000-A9Y4G:1:1101:10000:18672_1:N:0:1 gene_id_118536 100.00 193 0 0 1 193 54 246 1.6e-103 373.0 193
M01562:52:000000000-A9Y4G:1:1101:10000:18672_2:N:0:1 gene_id_118536 98.83 257 3 0 1 257 427 171 3.4e-137 485.0 257
M01562:52:000000000-A9Y4G:1:1101:10000:21866_2:N:0:1 gene_id_120720 100.00 195 0 0 1 195 448 254 4.9e-104 375.0 200
M01562:52:000000000-A9Y4G:1:1101:10000:5922_1:N:0:1 gene_id_17051 100.00 149 0 0 1 149 1849 1701 3.4e-78 289.0 149
M01562:52:000000000-A9Y4G:1:1101:10000:5922_2:N:0:1 gene_id_17051 100.00 123 0 0 1 123 1522 1644 1.3e-62 237.0 123
M01562:52:000000000-A9Y4G:1:1101:10000:6256_1:N:0:1 gene_id_121202 98.73 157 2 0 1 157 179 23 1.9e-81 300.0 157
M01562:52:000000000-A9Y4G:1:1101:10001:11433_1:N:0:1 gene_id_125209 99.07 108 1 0 1 108 118 11 1.8e-53 207.0 108
M01562:52:000000000-A9Y4G:1:1101:10001:11433_2:N:0:1 gene_id_125209 99.15 118 1 0 4 121 1 118 2.9e-59 226.0 121
M01562:52:000000000-A9Y4G:1:1101:10001:17591_1:N:0:1 gene_id_2387 100.00 152 0 0 1 152 1378 1529 2.2e-80 296.0 152
M01562:52:000000000-A9Y4G:1:1101:10001:17591_2:N:0:1 gene_id_2387 100.00 152 0 0 1 152 1529 1378 2.2e-80 296.0 152
M01562:52:000000000-A9Y4G:1:1101:10001:17844_1:N:0:1 gene_id_9456 100.00 100 0 0 1 100 176 275 8.5e-50 194.0 100
gene_id_9456 2
gene_id_125209 5
gene_id_2387 2
awk '{cnt[$2]++} END{for (gene in cnt) print gene, cnt[gene]}' file
现在,我需要做的是计算第二列,即一些基因ID,然后打印到一个单独的文件中,该文件包含每个基因ID及其在文件中出现的重复次数或次数。就这样,
M01562:52:000000000-A9Y4G:1:1101:10000:13082_1:N:0:1 gene_id_8535 100.00 254 0 0 1 254 302 49 3.2e-140 495.0 254
M01562:52:000000000-A9Y4G:1:1101:10000:18672_1:N:0:1 gene_id_118536 100.00 193 0 0 1 193 54 246 1.6e-103 373.0 193
M01562:52:000000000-A9Y4G:1:1101:10000:18672_2:N:0:1 gene_id_118536 98.83 257 3 0 1 257 427 171 3.4e-137 485.0 257
M01562:52:000000000-A9Y4G:1:1101:10000:21866_2:N:0:1 gene_id_120720 100.00 195 0 0 1 195 448 254 4.9e-104 375.0 200
M01562:52:000000000-A9Y4G:1:1101:10000:5922_1:N:0:1 gene_id_17051 100.00 149 0 0 1 149 1849 1701 3.4e-78 289.0 149
M01562:52:000000000-A9Y4G:1:1101:10000:5922_2:N:0:1 gene_id_17051 100.00 123 0 0 1 123 1522 1644 1.3e-62 237.0 123
M01562:52:000000000-A9Y4G:1:1101:10000:6256_1:N:0:1 gene_id_121202 98.73 157 2 0 1 157 179 23 1.9e-81 300.0 157
M01562:52:000000000-A9Y4G:1:1101:10001:11433_1:N:0:1 gene_id_125209 99.07 108 1 0 1 108 118 11 1.8e-53 207.0 108
M01562:52:000000000-A9Y4G:1:1101:10001:11433_2:N:0:1 gene_id_125209 99.15 118 1 0 4 121 1 118 2.9e-59 226.0 121
M01562:52:000000000-A9Y4G:1:1101:10001:17591_1:N:0:1 gene_id_2387 100.00 152 0 0 1 152 1378 1529 2.2e-80 296.0 152
M01562:52:000000000-A9Y4G:1:1101:10001:17591_2:N:0:1 gene_id_2387 100.00 152 0 0 1 152 1529 1378 2.2e-80 296.0 152
M01562:52:000000000-A9Y4G:1:1101:10001:17844_1:N:0:1 gene_id_9456 100.00 100 0 0 1 100 176 275 8.5e-50 194.0 100
gene_id_9456 2
gene_id_125209 5
gene_id_2387 2
awk '{cnt[$2]++} END{for (gene in cnt) print gene, cnt[gene]}' file
基因ID具有不同的数字if字符,并且完全不同,所以我尝试过的一切都不起作用
还有,有人能推荐一些真正好的网站来了解awk吗?我一直在阅读,但希望有更多的资料来源。以下
awk
scriptcountGenes。awk
可以完成这项工作:
#
# countGenes.awk
#
BEGIN {
columns = 13
geneColumn = 2
}
# select only lines with the expected number of fields
(NF == columns) {
geneCounts[$geneColumn]++
}
END {
# loop through the associative table of counts
for (gene in geneCounts) {
# write count to file
fileName = "count_" gene ".txt"
printf "%s\t%d\n", gene, geneCounts[gene] >fileName
# for logging
printf "%s\t%d\n", gene, geneCounts[gene]
}
}
使用以下命令运行脚本:
awk -f countGenes.awk testDataGenes.txt
很可能你需要的就是这样的东西:
M01562:52:000000000-A9Y4G:1:1101:10000:13082_1:N:0:1 gene_id_8535 100.00 254 0 0 1 254 302 49 3.2e-140 495.0 254
M01562:52:000000000-A9Y4G:1:1101:10000:18672_1:N:0:1 gene_id_118536 100.00 193 0 0 1 193 54 246 1.6e-103 373.0 193
M01562:52:000000000-A9Y4G:1:1101:10000:18672_2:N:0:1 gene_id_118536 98.83 257 3 0 1 257 427 171 3.4e-137 485.0 257
M01562:52:000000000-A9Y4G:1:1101:10000:21866_2:N:0:1 gene_id_120720 100.00 195 0 0 1 195 448 254 4.9e-104 375.0 200
M01562:52:000000000-A9Y4G:1:1101:10000:5922_1:N:0:1 gene_id_17051 100.00 149 0 0 1 149 1849 1701 3.4e-78 289.0 149
M01562:52:000000000-A9Y4G:1:1101:10000:5922_2:N:0:1 gene_id_17051 100.00 123 0 0 1 123 1522 1644 1.3e-62 237.0 123
M01562:52:000000000-A9Y4G:1:1101:10000:6256_1:N:0:1 gene_id_121202 98.73 157 2 0 1 157 179 23 1.9e-81 300.0 157
M01562:52:000000000-A9Y4G:1:1101:10001:11433_1:N:0:1 gene_id_125209 99.07 108 1 0 1 108 118 11 1.8e-53 207.0 108
M01562:52:000000000-A9Y4G:1:1101:10001:11433_2:N:0:1 gene_id_125209 99.15 118 1 0 4 121 1 118 2.9e-59 226.0 121
M01562:52:000000000-A9Y4G:1:1101:10001:17591_1:N:0:1 gene_id_2387 100.00 152 0 0 1 152 1378 1529 2.2e-80 296.0 152
M01562:52:000000000-A9Y4G:1:1101:10001:17591_2:N:0:1 gene_id_2387 100.00 152 0 0 1 152 1529 1378 2.2e-80 296.0 152
M01562:52:000000000-A9Y4G:1:1101:10001:17844_1:N:0:1 gene_id_9456 100.00 100 0 0 1 100 176 275 8.5e-50 194.0 100
gene_id_9456 2
gene_id_125209 5
gene_id_2387 2
awk '{cnt[$2]++} END{for (gene in cnt) print gene, cnt[gene]}' file
但如果没有样本输入和预期输出,这只是猜测。不要告诉我们“类似”您的输入或最佳情况,您将得到“类似”的答案。告诉我们您的数据的粗略格式是不够的。编辑您的问题,以包括一小部分(5-10行)实际代表性示例输入和相关的预期输出,我们可以针对这些输出运行脚本,并将其输出与我们想要测试解决方案的结果进行比较。最好的awk资源是Arnold Robbins的第三版《有效的awk编程》。@EdMorton:你的信息很有用,你的提示很有价值。但语气有点粗鲁,并没有真正邀请第一次使用的用户留下来。第一个问题MPR6做得很好。@Axelkeper同意,我的语气有点粗鲁,但我不同意OP在发布问题时做得很好。我们都知道我们想要什么样的信息来帮助我们回答问题。这与在这个网站上发帖没有什么特别的关系,只是在一般情况下向人们寻求帮助。因此,有人在没有这些信息的情况下发布了一个问题,他们告诉我,他们不会费心去帮助我们帮助他们,他们希望我们为他们做所有的工作。我只是用我的数据示例编辑了我的帖子,尽管你们两人提供的答案非常有用。再次感谢!是的,很抱歉。样本输出不基于样本输入,但我已经纠正了这一点,并删除了“第1列第2列”。谢谢你的提示!下一次我肯定会写一篇更好的文章。非常紧凑的“代码高尔夫”解决方案!就像我在回答中建议的脚本一样。@AxelKemper“代码高尔夫”解决方案将使用单字符变量名,这只是一个合理、简洁的解决方案。