繁体   English   中英

在最后一个分隔符之后提取文本并附加在行尾 [Linux/Ubuntu]

[英]Extract text after last delimiter and attach at end of line [Linux/Ubuntu]

我有一个如下所示的 fasta 文件:

>sequence_1_g1
ATTTCGGATAA
>sequence_2_g1
AGGCTCTAGGA
>sequence_2_g2
TGTTCTGAAAT
>sequence_2_g3
CACCTCGGAGT
>sequence_3_new_g1
GCGGATAAAGC

我只想提取最后一个分隔符之后的数字并将它们附加到每个 header 的末尾,以便 output 如下所示:

>sequence_1_g1_1
ATTTCGGATAA
>sequence_2_g1_1
AGGCTCTAGGA
>sequence_2_g2_2
TGTTCTGAAAT
>sequence_2_g3_3
CACCTCGGAGT
>sequence_3_new_g1_1
GCGGATAAAGC

我以前从未使用过 linux ,到目前为止,我只能找到此命令来分隔最后一个分隔符之后的文本: sed -E 's/.*_//' filename.fasta 除了获得我想要的 output 之外,任何人都可以就我应该寻找哪些命令提出建议吗?

第一种解决方案:使用您显示的示例,请尝试遵循awk代码。 用 GNU awk编写和测试,应该在它的任何版本中工作。

awk '/^>/{$0=$0 "_" substr($0,length($0))} 1' Input_file

第二种解决方案:使用 GNU awkmatch function 与正则表达式和捕获组的值,请尝试以下。

awk 'match($0,/^>.*([0-9]+)$/,arr){$0=$0"_"arr[1]} 1'  Input_file

第三种解决方案:假设您的行总是在从>开始的行中分隔_g ,那么我们也可以简单地尝试遵循awk代码。

awk -F'_g' '/^>/{$0=$0"_"$2} 1'  Input_file

第四种解决方案:如果perl被接受,您可以简单地使用 perl 捕获组的功能(如果正则表达式具有真正的匹配,则将创建该功能)。

perl -pe 's/(^>.*)([0-9]+$)/\1\2_\2/'  Input_file

您可以试试这个sed ,它在行开头搜索> ,如果匹配,那么它在结尾匹配 1+ 位并替换为number_number ZE83AED3DDF4667DEC0DAAAACB2BB3BE0BZ 表达式:

sed -E '/^>/s/[0-9]+$/&_&/' file

>sequence_1_g1_1
ATTTCGGATAA
>sequence_2_g1_1
AGGCTCTAGGA
>sequence_2_g2_2
TGTTCTGAAAT
>sequence_2_g3_3
CACCTCGGAGT
>sequence_3_new_g1_1
GCGGATAAAGC

使用sed

$ sed -E 's/.*_.([0-9]+)/&_\1/' input_file
>sequence_1_g1_1
ATTTCGGATAA
>sequence_2_g1_1
AGGCTCTAGGA
>sequence_2_g2_2
TGTTCTGAAAT
>sequence_2_g3_3
CACCTCGGAGT
>sequence_3_new_g1_1
GCGGATAAAGC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM