Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何删除x个具有相同字符串的条目,并仅保留一个具有修改标题的条目?_Bash_Perl_Awk_Sed_Fasta - Fatal编程技术网

Bash 如何删除x个具有相同字符串的条目,并仅保留一个具有修改标题的条目?

Bash 如何删除x个具有相同字符串的条目,并仅保留一个具有修改标题的条目?,bash,perl,awk,sed,fasta,Bash,Perl,Awk,Sed,Fasta,我有一个问题要问所有awk/sed/perl专家。我遇到一个具有以下格式的文件,例如: >GALHOMG00000016026_1 GALHOMT00000016026_1 GALHOMP00000016026_1 JH556633.1:35740-45316 1 MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRK

我有一个问题要问所有awk/sed/perl专家。我遇到一个具有以下格式的文件,例如:

>GALHOMG00000016026_1 GALHOMT00000016026_1 GALHOMP00000016026_1 JH556633.1:35740-45316 1
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF
SNLNLGRTYASGYAHYEEPED

>HUMHOMG00000262990_1 HUMHOMT00000262990_1 HUMHOMP00000262990_1 JH556633.1:35740-45316 1
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF
SNLNLGRTYASGYAHYEEPED

>TGUHOMG00000002432_1 TGUHOMT00000002432_1 TGUHOMP00000002432_1 JH556633.1:35740-45316 1
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF
SNLNLGRTYASGYAHYEEPED
我想将此文件修改为以下内容:

>JH556633.1:35740-45316
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF
SNLNLGRTYASGYAHYEEPED
我知道我可以修改我所称的标题(我是指>>后面的行),如下所示:

awk 'NF > 1{$0=">"$4}; {print $0}' file.fa > file2.fa
我的问题是,我如何删除另外两段?文件中可能存在段落字符序列(即不计算标题行)不相同的情况。在这种情况下,我希望根据具有相同标识符的条目数附加一个扩展名(例如,在本例中,第一个
JH556633.1-1:35740-45316
,第二个
JH556633.1-2:35740-45316
,或类似的内容)。要点是使相同的标题(以
开头的行)不同,但如果它们不相同,则保留原始字符序列


如果有人有办法解决这个问题,我将非常感谢您的帮助。谢谢

假设
$4
不能包含每个发布的输入的
&
\
(如果可以,这是一个很小的调整):


看起来你还有另一个问题,所以发布一个新问题,其中包含一些有代表性的输入和该问题的预期输出。

这应该适合你。它不依赖于不同序列之间的空行,因为并非所有fasta文件都有这些空行。它向每个ID添加
\N
,其中
N
是找到该ID的次数。仅与单个序列关联的ID将具有
\u 1
。如果一个ID与多个不同的序列相关联,则将打印所有这些序列

#/usr/bin/env perl
严格使用;
使用警告;
##要保留的ID行的字段。
##因为我们从0开始计数,所以得到第四个
##字段,将其设置为3。
我的$want=3;
我的(@字段,%seq,%seed,$seq);
##读取输入文件
而(){
##跳过空行
下一个if/^\s*$/;
##删除尾部换行符
咀嚼;
##这是身份证号码吗?
如果(/^\s*>(.*)/){
##保存上一个序列(如果有)。%seqs
##哈希将序列作为键和所需的
##ID作为一个值。
如果($fields[0]){
$seqs{$seq}=$fields[$want];
##清除前面的序列和ID
$seq=“”;
@字段=();
}
##将ID字段拆分为@fields。
@字段=拆分(/\s+/);
}
##如果这是一个序列,则添加到$seq
否则{
$seq.=$\ux;
}
}
##获取最后一个序列
$seqs{$seq}=$fields[$want];
foreach my$序列(排序键(%seqs)){
##添加一个标识符。
$seen{$seqs{$sequence}}++;
打印“>$seqs{$sequence}{$sequence}\n”;
##将序列转换回FASTA
$sequence=~s/(.{60})/$1\n/g;
打印“$sequence\n”;
}
将脚本另存为
foo.pl
或其他格式,使其可执行
chmod 744 foo.pl
,并作为以下格式运行:

$ ./foo.pl file.fa 
>JH556633.1:35740-45316_1
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF
SNLNLGRTYASGYAHYEEPED

根据您的示例(GNU sed上的posix版本so
--posix

您是指
大于号的那一行之后的那一行还是以
大于号开始的那一行?请向我们展示您解决问题的尝试(不仅仅是您发布的awk命令,它只处理第一行).谢谢你的建设性回复!外星人带着你的宇宙飞船飞向你的星球我是说以大于号开始的那一排
$ ./foo.pl file.fa 
>JH556633.1:35740-45316_1
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF
SNLNLGRTYASGYAHYEEPED
sed -n 's/^>\([^ ]\{1,\} \)\{3\}/>/;/^ *$/q;p' YourFile