我有一个很长的ID列表需要解析。我想提取三条信息并写入3列CSV。第1列= tr之间的字段|XXXX年|,第3列=第二个之后的字段|但在OS=之前。
第2列是有条件的。如果行中有'GN=XXX',我希望它返回XXX。如果GN=不存在,我希望写入第3列的第一部分(即,直到第一个空格)。
输入:
>tr|I1WXP1|I1WXP1_9EURY Methyl coenzyme M reductase subunit A (Fragment) OS=uncultured euryarchaeote OX=114243 GN=mcrA PE=4 SV=1
>tr|A0A059VAR9|A0A059VAR9_9EURY V-type ATP synthase beta chain (Fragment) OS=Halorubrum sp. Ga66 OX=1480727 GN=atpB PE=3 SV=1
>tr|Q51760|Q51760_9EURY Glutaredoxin-like protein OS=Pyrococcus furiosus OX=2261 PE=1 SV=1
所需输出:
I1WXP1,mcrA,I1WXP1_9EURY Methyl coenzyme M reductase subunit A (Fragment)
A0A059VAR9,atpB, A0A059VAR9_9EURY V-type ATP synthase beta chain (Fragment)
Q51760,Q51760_9EURY,Q51760_9EURY Glutaredoxin-like protein
我可以用awk得到前两个,例如:
awk '{split($0,a,"|"); print a[2]
但是我不能计算出条件,或者如何巧妙地对“GN=”模式进行操作。
例如,提取粗体文本:
tr|**I1WXP1**|**I1WXP1_9EURY Methyl coenzyme M reductase subunit A (Fragment)**OS=uncultured euryarchaeote OX=114243 GN=**mcrA**PE=4 SV=1
变成:
I1WXP1, mcrA, I1WXP1_9EURY Methyl coenzyme M reductase subunit A(Fragment)
5条答案
按热度按时间nxagd54h1#
每当你的输入包含tag=value对时,我发现最好先创建一个数组来包含这个Map,然后你可以通过标签(名称)来访问值,比如使用任何awk:
使用这种方法,如果您想打印或测试其他字段,这是微不足道的,例如:
kuarbcqp2#
作为
sed
中的备选项:gg0vcinb3#
这可能对你有用(GNU sed):
使用模式匹配和反向引用来格式化所需的结果。
如果第一个匹配失败,请使用第二个匹配。
如果两者都不匹配,则无输出。
knsnq2tg4#
GNU Awk
第一个
rur96b6h5#
***第一个解决方案(GNU
awk
版本):***使用您显示的示例,请尝试以下awk
代码。使用GNUawk
中显示的示例编写并测试。***第二个解决方案(适用于任何
awk
版本):***添加适用于任何版本的额外awk
代码。