Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Awk 在特定图案后添加换行符_Awk_Sed - Fatal编程技术网

Awk 在特定图案后添加换行符

Awk 在特定图案后添加换行符,awk,sed,Awk,Sed,我有一个包含数千个蛋白质序列的文件,格式如下 >EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV 但这不起作用 更新 谢谢大家的关注。事后看来

我有一个包含数千个蛋白质序列的文件,格式如下

>EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV 但这不起作用

更新 谢谢大家的关注。事后看来,我觉得我可以简化我的要求。下面是我文件中的一个较大样本

>EgrG_000615900 transcript=EgrG_000615900 gene=EgrG_000615900MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV >EgrG_001057700 transcript=EgrG_001057700 gene=EgrG_001057700MEESNSEPVIFQVSKLAGRHNYTSFGHKEDLDPQNKFSIPSPADHPGKHRSVLRSLFKGMSSGGKNVALEEQQPTYRQAGSSSHHRYHIHHYPHNPSDDRRPLRGPCFPHMSSSSQSASAFSSPNSSSSPGQRVSTFHAGLREEVLEQDGTSSTTQANFSEEPLVLLVLFPASKSKEAVLPLTTVGRNDCCATASVFTLRLASTYCDVAFFINYFS >EgrG_000972800 transcript=EgrG_000972800 gene=EgrG_000972800MTSYCAVFMVPLLTLLILWGHLPACESTPLPSELIVRRGRTLQDLYRYVQQQYLMCLKCPNCPCETKFNIRRRSGGINWPQYMNASGMTAKNMEEALDDY >EgrG_000198800 transcript=EgrG_000198800 gene=EgrG_000198800MPETGKSGGTTISSKTKSTAVSSGTPVKPMKSESCRLISGESPTSVVILKPAWASFVTPFPPVQEKCCKCGQLVRFSDRIELLGKVFHESCFRCAVCNRPLSNSEAIFHSNAWNCEAHASSYPRLYAS` i、 e.在一行中加入,在下一行中加入蛋白质序列。总之,在

>EgrG_......... transcript=EgrG_......... gene=EgrG_......... >废气再循环。。。。。。。。。转录本=EgrG。。。。。。。。。基因=EgrG。。。。。。。。。 第一个“M”是必需的

再次感谢大家的耐心

@DKaplinski:试试:

awk --re-interval '{match($0,/.*EgrG_[0-9]{9}MAIRS/);print substr($0,RSTART,RLENGTH-5);sub(/.*EgrG_[0-9]{9}MAIRS/,"");print "MAIRS" $0}'  Input_file
上面将EgrG_除以9位,然后将行的其余部分与行的其余部分分开,直到EgrG_,然后将MARIS与行的其余部分分开。如果这对你有帮助,请告诉我

$ sed 's/M/\
&/' file
EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900
MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV
FIV

如果这还不是您所需要的全部,那么请更新您的问题,以显示更具代表性的示例输入和预期输出。

另一个
sed

sed -r 's/(^>(.+)transcript=\2gene=\2)/\1\n/' file
sed 's/[ARNDCQEGHILKMFPSTWYVBZ]*$/\'$'\n&/g' file
查找模式
{KEY}transcript={KEY}gene={KEY}
并插入换行符

>EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900
MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV

您可以使用二十种氨基酸列表提取蛋白质序列(IUPAC符号,无终止密码子符号)

使用
sed

sed -r 's/(^>(.+)transcript=\2gene=\2)/\1\n/' file
sed 's/[ARNDCQEGHILKMFPSTWYVBZ]*$/\'$'\n&/g' file
您得到,
fasta
格式对应

>EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900 MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV >EgrG_000615900转录本=EgrG_000615900基因=EgrG_000615900 MAIRSFGRIAPARSLIHFKLVTDAFGEAPGPylpQaarsllCEKCDGKCVICTDSYVRPCTLICDECNYGSYGRCVICGGTGVSDAYYCREPTSFTKGRNMDSKNDLISNKFTMHADVIILPGLFFIV
图案的长度是固定的。因此,只需在希望新行开始的列点处拆分该行。例如,在第40个字符处拆分行:

sed -E $'s/(^.{40})/\\1\\\n/g' < file
sed-E$'s/(^.{40})/\\1\\\n/g'

(注意:我使用的是OS X sed。我不得不用
$'
来摆脱这种模式)

文件是否有其他类型的行?在GNU awk中,Re interval已经默认启用了好几年了,所以摆脱
--Re interval
(或者获得一个新的awk!)。谢谢Ed Morton,是的,我有GNUAWK3.1.7,但它是如何直到/除非我放入--re interval才选择这个正则表达式的。另外,我还有一个问题(如果你不介意的话),我试图通过放置类似regex的gsub(/EgrG_[0-9]{9}[^(MAIRS)],但我知道这里是字符,所以我怎么能在这里使用一个单词而不是字符,你能帮我做同样的事情吗?这是一个侏罗纪版本的gawk,已经过时5年多了,买一个现代版本!要有力地否定一个单词/字符串,你必须创建一个输入中不存在的字符,将单词映射到该字符,然后否定它t字符,然后将字符转换回单词。例如,
(gsub(/@/,“@A”);gsub(/X/,“@B”);gsub(/MAIRS/,“X”);gsub(/…[^X]/,…);gsub(/X/,“MAIRS”);gsub(/@B/,“X”);gsub(/@A/,“@”)
。考虑一下,添加print语句,看看它是如何工作的,如果不清楚的话,可以发布一个问题。你好,Jose,使用您的命令,我得到了这个返回;
sed:invalical option--r用法:sed script[-Ealn][I extension][file…]sed[-Ealn I extension][e script。。。[-f script_file]…[file…]
use
sed/[arndcqeghilkmfstwyvbz]*$/\n&/'file
相反…..您使用
gnu sed
这将在需要换行符的位置返回一个“n”;
>EgrG_000615900 transcript=EgrG_000615900 gene=EgrG_00061590; 000615900 nmairsfgriapaspallihfklvttdafgeapylpqaarsllcedgdgCvicdSyvCvTvTvTvTvTcDecNyGrCvCvCvCvTvDayYcResptsKfKfKfRnKfRnKfRnKfRnKgrCvTvTvTvTvTvTvTvTvT's/[arndcqeghilkmfstwyvbz]*$/\'$'\n和/g'文件
-r
是特定于GNU的,当它在GNU和OSX SED(以及其他)上工作时,请使用
-E
sed 's/[ARNDCQEGHILKMFPSTWYVBZ]*$/\'$'\n&/g' file
>EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900 MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV
sed -E $'s/(^.{40})/\\1\\\n/g' < file