【发布时间】:2021-02-10 07:29:01
【问题描述】:
我有一个类似这样的制表符分隔文件,其中包含大约 120 000 个名为 no-dots.txt 的条目:
cluster0 E:1.2e-12^RecName: Full=Putative tyrosine phosphatase 123R;^Viruses
cluster1 E:1.2e-12^RecName: Full=Putative tyrosine phosphatase 123R;^Viruses
cluster2 E:1.2e-12^RecName: Full=Putative tyrosine phosphatase 123R;^Viruses
到目前为止,我有以下脚本:
readarray -t clusternames_array < clusternames.txt
for name in "${clusternames_array[@]}"
do
grep -w $name **no-dots.txt** | awk -F "\t" '{print $2}' | awk -F '=' '{print $2}' | awk -F ";" '{print $1}' | sed s/{[^{}]*}//g | sort | uniq -c | sort -k 1,1nr | head -n 1 | cut -b 5-8
done
我正在对文件中的每个集群(cluster0、cluster1、cluster2、... cluster120000)进行 grep-ping 操作,并尝试在第二列中提取信息。
接下来的三个awk步骤,和sed步骤只是为了减少
E:1.2e-12^RecName: Full=Putative tyrosine phosphatase 123R;^Viruses
类似于
Putative tyrosine phosphatase 123R
这一步对我来说很好。
sort | uniq -c | sort只是统计每个簇中唯一名称的个数,从升序到降序排序。
head -n 1 让我继续使用出现次数最多的名称。
这个输出通常类似于
7 Putative tyrosine phosphatase 123R
由于这种格式,我只是使用
cut -b 5-8 提取出现次数
cut -b 5-8 --complement 提取最常出现的条目的名称
我在 for 循环中运行它,以便获得一个包含 120 000 个数字/名称的列表,我可以简单地将其粘贴到 Excel 文件中。最终,即使 grep 没有找到任何内容,我也希望为 EVERY 集群创建一个条目。但是,如果此代码的输出什么都没有(据我所知是一个空字符串),则它不会写入生成的列表中。我最终得到的文件总是要短得多。
如何更改我的脚本以包含没有值的行,以便最终得到一个包含 120 000 个条目的输出文件?
作为一个例子,我得到一个这样的文件:
name0
name1
name3
name4
name6
name7
name9
其中 name2、name5、name8 等被省略,但我想添加任何占位符来保持每个输出的位置:
name0
name1
NULL
name3
name4
NULL
name6
name7
NULL
name9
【问题讨论】:
-
请阅读editing help。