[英]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 awk
的match
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.