我发布了一个之前的问题,我使用 awk 得到了一个很好的解决方案。但我遇到了一个新问题,并意识到我需要提取得分最高的比赛iftop我有多个顶级比赛。
我不知道 awk,所以我确实弄乱了 chatgpt 教程,并从中得到了一些东西,但我无法真正让它在不同的场景下一致工作。
我的问题
我想从
hitcounts.csv
中为我的 ASVlist.txt
中的每个 ASV 提取行,其中:
返回具有最高
Hit
值的 ASV 行(即,它与之前的文件具有最多的匹配项,因此包含此谱系信息的这一行很可能是该物种/属)。
但是...在许多的情况下,多个物种/属将具有相同的热门点击。如果是一些(我认为),没问题,我通常可以手动检查它们。但这次我最终得到了数百。因此,从具有相同顶部命中的多行中,then返回具有最低 e 值的行。
在许多情况下,它们具有相同的 e 值,因此从这些行中返回具有最高百分比同一性值的那个。
如果一切都相同,则只需返回短语“Multiple lineages can be Matched to this ASV”。如果根本没有匹配项(确实发生了),则返回“此 ASV 没有匹配项。”。
我的
hitcounts.csv
文件片段:
ASV Perc_Identity Evalue Kingdom Phylum Class Order Family Genus Hits
45b552aed13b0b8465b4a38e3e8ff9fc 90.667 3.81E-47 Eukaryota Arthropoda Insecta Hymenoptera Megachilidae Megachile 3
45b552aed13b0b8465b4a38e3e8ff9fc 89.796 8.24E-44 Eukaryota Arthropoda Insecta Hymenoptera Megachilidae Osmia 4
45b552aed13b0b8465b4a38e3e8ff9fc 95.652 1.40E-31 Eukaryota Arthropoda Insecta Hymenoptera Halictidae Dufourea 1
45b552aed13b0b8465b4a38e3e8ff9fc 86.861 1.40E-31 Eukaryota Arthropoda Insecta Hymenoptera Halictidae Megalopta 2
ff19ffd535c0aefe8575aafcc20265de 96.599 1.73E-60 Eukaryota Streptophyta Zygnemophyceae Desmidiales Closteriaceae Closterium 1
ff19ffd535c0aefe8575aafcc20265de 96.575 6.24E-60 Eukaryota Streptophyta Zygnemophyceae Desmidiales Closteriaceae Closterium 1
ff19ffd535c0aefe8575aafcc20265de 95.918 8.07E-59 Eukaryota Streptophyta Zygnemophyceae Desmidiales Closteriaceae Spinoclosterium 1
ff19ffd535c0aefe8575aafcc20265de 95.918 8.07E-59 Eukaryota Streptophyta Zygnemophyceae Desmidiales Closteriaceae Closterium 4
523acf9c870d416b8c2fe803ca314730 88.776 3.94E-22 Eukaryota Arthropoda Insecta Hymenoptera Colletidae Colletes 4
523acf9c870d416b8c2fe803ca314730 89.691 3.05E-23 Eukaryota Arthropoda Insecta Hymenoptera Colletidae Hylaeus 4
69863838a7fb9e431a01aaebf8e055f0 99.329 2.86E-68 Eukaryota Streptophyta Magnoliopsida Apiales Apiaceae Chaerophyllum 1
69863838a7fb9e431a01aaebf8e055f0 99.329 2.86E-68 Eukaryota Streptophyta Magnoliopsida Apiales Apiaceae Sinocarum 1
当我在终端中将代码作为 bash 脚本运行时所需的输出:
> ./max_asv.sh 45b552aed13b0b8465b4a38e3e8ff9fc hitcounts.csv
45b552aed13b0b8465b4a38e3e8ff9fc,Eukaryota,Arthropoda,Insecta,Hymenoptera,Megachilidae,Osmia,4
> ./max_asv.sh ff19ffd535c0aefe8575aafcc20265de hitcounts.csv
ff19ffd535c0aefe8575aafcc20265de,Eukaryota,Streptophyta,Zygnemophyceae,Desmidiales,Closteriaceae,Closterium,6
> ./max_asv.sh madeupASVakasdjlasd hitcounts.csv
madeupASVakasdjlasd,This ASV has no matches!
> ./max_asv.sh 523acf9c870d416b8c2fe803ca314730 hitcounts.csv
523acf9c870d416b8c2fe803ca314730,Eukaryota,Arthropoda,Insecta,Hymenoptera,Colletidae,Hylaeus,4
> ./max_asv.sh 69863838a7fb9e431a01aaebf8e055f0 hitcounts.csv
69863838a7fb9e431a01aaebf8e055f0,There are 2 lines tied for top [max value = 1]
我试图处理的另一个烦人的警告是,有时如果您查看分类列(界到属),我也会有多个实际上是相同谱系的匹配,但它们单独显示,因为它们的同一性百分比可能略有不同或 e 值。在这种情况下,我一直在尝试仅根据谱系列对“点击”列进行求和以获得总和计数,然后如果仍然存在多行,那么我需要检查 e 值,然后检查百分比同一性。
代码:
#!/bin/bash
max_asv() {
if [ $# -ne 2 ]; then
echo "Usage: max_asv <ASV> <CSV File>"
return 1
fi
local asv="$1"
local file="$2"
awk -F, -v asv="$asv" '
$1 == asv { if ($NF >= max_val) {
if ($NF > max_val) {
delete matches
cnt = 0
max_val = $NF
}
matches[++cnt] = $0
}
}
END { if (cnt == 0)
printf "%s, This ASV has no matches.\n", asv
else
if (cnt==1)
print matches[cnt]
else
printf "%s, There are %s lines tied for top [max value = %s].\n", asv, cnt, max_val
}
' "$2"
}
# Call the function with arguments passed to the script
max_asv "$1" "$2"
此代码适用于某些情况,但以下是我目前的输出,其中有些标记有些错误:
# This is ok
45b552aed13b0b8465b4a38e3e8ff9fc,89.796,8.24E-44,Eukaryota,Arthropoda,Insecta,Hymenoptera,Megachilidae,Osmia,4
# I don't know how to make it sum up the hits. Value should be 6, not 4.
ff19ffd535c0aefe8575aafcc20265de,95.918,8.07E-59,Eukaryota,Streptophyta,Zygnemophyceae,Desmidiales,Closteriaceae,Closterium,4
# This came out ok
madeupASVakasdjlasd, This ASV has no matches.
# Wrong, as I couldn't add to the code to get it to parse through evalue and perc_identity. Also, this part of the code always prints out weird too and cuts off the ASV.
].3acf9c870d416b8c2fe803ca314730, There are 2 lines tied for top [max value = 4
# Correct but it's printing out weird and cutting the ASV off.
]. 63838a7fb9e431a01aaebf8e055f0, There are 2 lines tied for top [max value = 1
再次,我不知道 awk,我必须使用可用的资源来尝试这个。我想我已经完成了一半,但我一直被这些奇怪的情况困扰。感谢您的帮助。
这并不完全是您所要求的,但也许这可以给您提供线索。 只需对数据进行排序,您就可以做很多您想做的事情。 所以:
timr@tims-gram:~/src$ sort -k1,1 -k 10,10r -k 2,2r -k3,3r < x.txt | grep -v Evalue | uniq -w 32
45b552aed13b0b8465b4a38e3e8ff9fc 89.796 8.24E-44 Eukaryota Arthropoda Insecta Hymenoptera Megachilidae Osmia 4
523acf9c870d416b8c2fe803ca314730 89.691 3.05E-23 Eukaryota Arthropoda Insecta Hymenoptera Colletidae Hylaeus 4
69863838a7fb9e431a01aaebf8e055f0 99.329 2.86E-68 Eukaryota Streptophyta Magnoliopsida Apiales Apiaceae Chaerophyllum 1
ff19ffd535c0aefe8575aafcc20265de 95.918 8.07E-59 Eukaryota Streptophyta Zygnemophyceae Desmidiales Closteriaceae Closterium 4
我已将排序键指定为字段 1、字段 10 降序、字段 2 降序和字段 3 降序。 然后我从每组中提取第一行。
您可以将其输入
grep 45b55
以一次获取一行。