我有一个测试。包含以下数据的Fasta文件:
>PPP.0124.1.PC lib=RU01 length=410 description=Protein description goes here 1 serine/threonine
MLEAPKFTGIIGLNNNHDNYDLSQGFYHKLGEGSNMSIDSFGSLQLSNGG
GSVAMSVSSVGSNDSHTRILNHQGLKRVNGNYSVARSVNRGKVSHGLSDD
ALAQ
>PPP.14552.PC lib=RU01 length=104 description=Protein description goes here 2 uncharacterized protein LOC11441
MKSVVGMVVSNKMQKSVVVAVDRLFHHKLYDRYVKRTSKFMAHDEHNLCN
IGDRVRL
>PPP.94014.PC lib=RU01 length=206 description=Protein description goes here 3 some more chemicals and stuff
MDLGPTLTLQKGRQRRGKGPYAGVRSRGGRWVSEIRIPKTKTRIWLGSHH
SPEKAARAYDAALYCLKGEHGSFNFPNNRGPYLANRSVGSLPVDEIQCIA
AEFSCFDDSA
我想把ID和描述输出到一个.tsv
文件中,第一列是ID,第二列是描述。
所需输出:
| ID | Description |
| -------- | -------------- |
| 0124 | Protein description goes here 1 serine/threonine |
| 14552 | Protein description goes here 2 uncharacterized protein LOC11441 |
| 94014 | Protein description goes here 3 some more chemicals and stuff |
有什么想法可以用一行Bash命令来实现这个吗?
我现在有这个:
grep -a '^>' test.fasta |
awk '{print $1}
给了我第一行和ID,但似乎不能弄清楚其余的!
下面是一个简单的sed
脚本:
sed -n 's/^>[^0-9]*([0-9][0-9]*).*description=/1t/p' test.fasta
这只是查找以>
开头的行,可能是一些非数字后面跟着数字,然后在行后面的某个地方跟着description=
,并用数字和制表符替换该部分,并打印结果行。
(这里假设该行上的第一个数字序列是ID。它还要求您的sed
将t
解释为文字选项卡,这不是完全可移植的。)
同样可以很容易地转换为Awk,尽管它可能不那么优雅。
awk -F . 'BEGIN { OFS="t" }
/^>/ { d=$0; sub(/.*description=/, "", d); print $2, d }' test.fasta
,它假设ID的有趣部分总是在第一个和第二个点之间,并避免了无用的grep
。
这声明点作为-F .
的字段分隔符,输出字段分隔符OFS
作为制表符,然后从原始输入行$0
中提取description=
之后的所有内容到以>
开头的行上的变量d
中,然后打印第二个字段和d
。
我不得不猜测一些需求;如果我的猜测是错误的,请编辑您的问题,以明确如何准确地提取数字ID,例如。
使用awk
:
awk 'BEGIN{print "idtdescription"}
/.PC / && !/uncharac/ {
split($1,b,"."); id=b[2];
$1=""; $2=""; $3=""; $(NF)=""; $(NF-1)=""; $(NF-2)="";
gsub("description=",""); print id"t"$0}
/.PC / && /uncharac/ {
split($1,b,"."); id=b[2];
$1=""; $2=""; $3=""; $(NF)=""; $(NF-1)="";
gsub("description=",""); print id"t"$0}' test.fasta
id description
0124 Protein description goes here 1 || serine/threonine
14552 Protein description goes here 2 || uncharacterized protein LOC11441
94014 UProtein description goes here 3 || some more chemicals and stuff
由于描述可以跨越n
列,您需要删除'已知',不需要的列。在你们的检测数据中,似乎有些记录可以通过"未表征的蛋白质"来区分。含有"未表征蛋白"的记录只需要删除2个尾列,而其他记录需要删除3个尾列。
解析第一列的id:split($1,b,"."); id=b[2];
删除不需要的列:$1=""; $2=""; $3=""; $(NF)=""; $(NF-1)=""; $(NF-2)="";
或$1=""; $2=""; $3=""; $(NF)=""; $(NF-1)="";
(如果未表征的蛋白质)。
删除description=':gsub("description=","");