鉴于我拥有的字符串是基于来自不同文件的 ASV(如键),我想返回具有最高值的 ASV 匹配项。但是,有时会出现平局,这可能会带来问题,因此我想返回一条消息。
排序后,我能够返回具有最高值的行,但我不知道如何正确解释平局。
以下是我的文件的片段file.txt
:
ASV,Kingdom,Phylum,Class,Order,Family,Genus,Species,Hits
29ec61e470705074f483368a70ad18a7,Bacteria,???,???,???,???,???,uncultured bacterium,5
29ec61e470705074f483368a70ad18a7,Bacteria,Chloroflexota,Anaerolineae,???,???,???,uncultured Anaerolineae,2
29ec61e470705074f483368a70ad18a7,Bacteria,Chloroflexota,???,???,???,???,uncultured Chloroflexota,1
29ec61e470705074f483368a70ad18a7,Bacteria,???,???,???,???,???,unidentified marine,1
29ec61e470705074f483368a70ad18a7,Bacteria,Chloroflexota,Chloroflexia,Chloroflexales,Chloroflexaceae,Chloroflexus,uncultured Chloroflexus,1
74627d6dc445e8b5f46a787cf81c4294,Bacteria,Pseudomonadota,Gammaproteobacteria,Legionellales,Legionellaceae,???,uncultured Legionellaceae,2
74627d6dc445e8b5f46a787cf81c4294,Bacteria,???,???,???,???,???,uncultured bacterium,5
74627d6dc445e8b5f46a787cf81c4294,Bacteria,Pseudomonadota,Gammaproteobacteria,Legionellales,Legionellaceae,Legionella,Legionella sp.,3
55b1bec5f8dbe1b58007aee7ede9bae3,Bacteria,Bacteroidota,Cytophagia,Cytophagales,Cytophagaceae,Spirosoma,Spirosoma utsteinense,2
55b1bec5f8dbe1b58007aee7ede9bae3,Bacteria,???,???,???,???,???,uncultured bacterium,2
55b1bec5f8dbe1b58007aee7ede9bae3,Bacteria,Bacteroidota,Cytophagia,Cytophagales,Cytophagaceae,Spirosoma,Spirosoma sp.,2
55b1bec5f8dbe1b58007aee7ede9bae3,Bacteria,Bacteroidota,Cytophagia,Cytophagales,Cytophagaceae,Spirosoma,Spirosoma rigui,6
8964b7d833654ceedbdb6f6f25fb7d6a,Bacteria,???,???,???,???,???,uncultured bacterium,8
8964b7d833654ceedbdb6f6f25fb7d6a,Bacteria,Bacillota,Tissierellia,Tissierellales,Peptoniphilaceae,Finegoldia,Finegoldia magna,1
8964b7d833654ceedbdb6f6f25fb7d6a,???,???,???,???,???,???,uncultured organism,1
9966f0e6e452c31de46d030bab01fdd9,Bacteria,Bacteroidota,Sphingobacteriia,Sphingobacteriales,???,???,uncultured Cytophagales,2
9966f0e6e452c31de46d030bab01fdd9,Bacteria,Bacteroidota,Cytophagia,Cytophagales,Cytophagaceae,Spirosoma,Spirosoma jeollabukense,2
9966f0e6e452c31de46d030bab01fdd9,Bacteria,Bacteroidota,Cytophagia,Cytophagales,Cytophagaceae,Spirosoma,Spirosoma migulaei,2
9966f0e6e452c31de46d030bab01fdd9,Bacteria,Bacteroidota,Cytophagia,Cytophagales,Cytophagaceae,Spirosoma,Spirosoma sp.,1
举个例子,搜索 ASV29ec61e470705074f483368a70ad18a7
并返回具有最高值(最后一列)的匹配很容易:
代码:
> grep 29ec61e470705074f483368a70ad18a7 file.txt | sort -t, -nr -k9 | head -n1
# Output
29ec61e470705074f483368a70ad18a7,Bacteria,???,???,???,???,???,uncultured bacterium,5
但是如果我正在搜索诸如的 ASV 9966f0e6e452c31de46d030bab01fdd9
,我需要它以某种方式返回或知道可以返回三行(其中 3 行的值为 2)并输出一条消息:
理想输出:
> grep 9966f0e6e452c31de46d030bab01fdd9 file.txt | does something
# Output
CHECK: There are 3 lines tied for top.
我会选择一个
awk
解决方案:一个
awk
想法:为此
asv="123"
产生:为此
asv="29ec61e470705074f483368a70ad18a7"
产生:为此
asv="9966f0e6e452c31de46d030bab01fdd9"
产生:将其包装在
bash
函数中:对该功能进行测试:
用于
awk
仅匹配第一个字段中含有关键字的行。然后测试最后一个字段中的值是否等于或高于上次找到的最大值。如果相等,则增加计数器,否则将计数器重置为 1。grep
不适合这份工作。您可以使用以下awk
解决方案:然后将其用作:
这是一个 Ruby 实现的:
运行它: