使用bash输出特定字段



我有一个测试。包含以下数据的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。它还要求您的sedt解释为文字选项卡,这不是完全可移植的。)

同样可以很容易地转换为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=","");

最新更新