如何将每一行的第一列数据添加到由响应行中的某些特定字符串或字符标记的每列的头上?

2024-09-27 00:15:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一大块数据(一个文件)如下,每一行有不同的列数(用制表符分隔),数据结构如下 这个:

>NP_12345.1 matchnumber_1_RKHKK 
>NP_56789.2 matchnumber_1_HGRR  matchnumber_2_KQRHH  matchnumber_3_RVRK matchnumber_4_HTHH
>XP_543421.1    matchnumber_1_RQRH  ... matchnumber_m_RVRR
...

在上面的文件中,第1行有2列,第2行有5列,第3行有m+1列……;显然,文件的每一行都有“>;accessionID”和“matchnumber_i_XXX”。我想把每行的第1列添加到conresponding行中用“matchnumber”标记的每一列的头上,并以fasta格式打印出来,输出如下:

^{pr2}$

有人能帮我吗?提前谢谢。在

注:当有单行文件时,例如,“a.txt”文件只有一行内容:

>NP_56789.2 matchnumber_1_HGRR  matchnumber_2_KQRHH  matchnumber_3_RVRK matchnumber_4_HTHH

我可以使用管道awk和sed命令来解析数据:

cat a.txt |awk -v OFS="\t" '{print $1$2,$1$3,$1$4,$1$5}' | sed 's/\t/\n/g' | sed 's/_/ /g' | sed 's/NP /NP_/g' | sed 's/matchnumber /matchnumber_/g' | sed 's/ /\n/g' > a.fasta

法斯塔就像是在觅食:

>NP_56789.2matchnumber_1
HGRR
>NP_56789.2matchnumber_2
KQRHH
>NP_56789.2matchnumber_3
RVRK
>NP_56789.2matchnumber_4
HTHH

当a.txt有多行数据时,我不知道如何解决这个问题。在


Tags: 文件数据txt数据结构npsed制表符fasta
3条回答

另一个perl one liner:

perl -anE '($c1,@r)=split/\s+/,$_;for(@r){($c,$v)=$_=~/^(.+)_(.+)$/;say "$c1 $c\n$v"}' file.txt
>NP_12345.1 matchnumber_1
RKHKK
>NP_56789.2 matchnumber_1
HGRR
>NP_56789.2 matchnumber_2
KQRHH
>NP_56789.2 matchnumber_3
RVRK
>NP_56789.2 matchnumber_4
HTHH
>XP_543421.1 matchnumber_1
RQRH
>XP_543421.1 matchnumber_2
RQRH
>XP_543421.1 matchnumber_3
RQRH

说明:

^{pr2}$
$ cat jfile
>NP_12345.1     matchnumber_1_RKHKK
>NP_56789.2     matchnumber_1_HGRR      matchnumber_2_KQRHH     matchnumber_3_RVRK      matchnumber_4_HTHH

$ awk -F"\t" '{for(i=2;i<=NF;i++){match($i,"(matchnumber_[0-9]+)_(.*)",r);print $1 r[1] ORS r[2];}}' jfile
>NP_12345.1matchnumber_1
RKHKK
>NP_56789.2matchnumber_1
HGRR
>NP_56789.2matchnumber_2
KQRHH
>NP_56789.2matchnumber_3
RVRK
>NP_56789.2matchnumber_4
HTHH

从第二个字段$2循环到最后一个字段$NF,使用match和{}取出第一个字段的matchnumber_1和{},然后打印。在

在awk空间中,空格只是用于连接,ORS表示行尾,实际上等于\nr是正则表达式匹配数组,r[0]表示整个匹配字符串,r[1]和r[2]表示第一对和第二对()匹配的内容。--您可以将r更改为所需的其他变量名。在

至于regex,[0-9]表示任何单个数字,后面的+表示匹配1个或多个a前面表示的事物,这里表示1个或多个连续的数字。如上所述,括号只是用来捕捉组的内容,以供以后参考。每对括号匹配的内容都将保存到我提供的数组的一个元素中,这里是r。在

下面的^{}(对于^{}扩展)可能适用于您:

awk '{for(i=2;i<=NF;i++){print $1 gensub(/_([^_]+)$/,"\n\\1",1,$i)}}' file

相关问题 更多 >

    热门问题