复制系统发育树文件中的 DNA 序列名称,并向其中添加物种名称

复制系统发育树文件中的 DNA 序列名称,并向其中添加物种名称

从一个看起来像这样的文件:

(AJirio_TR15329|c4_g1_i4|m.30470:0.00230,(AJama_TR16613|c5_g2_i2|m.30203:0.00171,(AJkago_TR11651|c5_g2_i1|m.3847:0.00057,AJtok_TR11413|c7_g1_i1|m.3527:0.00033)1.00    :0.00080)0.94    :0.00085,Atab_TR15364|c0_g1_i1|m.4073:0.27697);

我需要获取这个文件:

AJirio_TR15329|c4_g1_i4|m.30470"AJirio"  
AJama_TR16613|c5_g2_i2|m.30203"AJama"
AJkago_TR11651|c5_g2_i1|m.3847"AJkago"
AJtok_TR11413|c7_g1_i1|m.3527"AJtok"
Atab_TR15364|c0_g1_i1|m.4073"Atab"

因此,基本上提取系统发育树中 DNA 序列的名称,并在其中添加带引号的物种名称(AJirio、AJkama..)。

答案1

Awk解决方案:

awk -v RS=',' -F':' '{ 
           sub(/^\(/, "", $1); 
           printf "%s\042%s\042\n", $1, substr($1, 1, index($1,"_")-1) 
       }' file
  • RS=','-,视为记录分隔符
  • -F':'-:视为字段分隔符
  • sub(/^\(/, "", $1)- 从第一个字段中删除前导括号$1
  • \042- 双引号字符的八进制 ASCII 代码"
  • substr($1, 1, index($1,"_")-1)- 提取物种名称从第一个字段开始(从起始位置1到第一次出现_char)

输出:

AJirio_TR15329|c4_g1_i4|m.30470"AJirio"
AJama_TR16613|c5_g2_i2|m.30203"AJama"
AJkago_TR11651|c5_g2_i1|m.3847"AJkago"
AJtok_TR11413|c7_g1_i1|m.3527"AJtok"
Atab_TR15364|c0_g1_i1|m.4073"Atab"

答案2

这似乎让你得到你想要的:

输入文件:

$ cat input
(AJirio_TR15329|c4_g1_i4|m.30470:0.00230,(AJama_TR16613|c5_g2_i2|m.30203:0.00171,(AJkago_TR11651|c5_g2_i1|m.3847:0.00057,AJtok_TR11413|c7_g1_i1|m.3527:0.00033)1.00    :0.00080)0.94    :0.00085,Atab_TR15364|c0_g1_i1|m.4073:0.27697);

将输入转换为输出的脚本。该脚本用于tr将逗号转换为换行符,然后用于sed消除所有空格、所有括号,并删除:一行上 a 之后的所有内容,然后用于awk打印该行,后跟引号,后跟第一个之前的文本|字符,最后用于sed修剪最后一个之后的所有内容_并添加尾部双引号。

$ cat script.sh
#!/bin/bash

input="${1}"
output="${2}"

cat "${input}" | tr ',' '\n' |
    sed -e 's/ //g' -e 's/[()]//g' -e 's/:.*$//' |
    awk -F'|' '{ print $0"\""$1 }' |
    sed -e 's/_[^_][^_]*$/"/' > "${output}"

运行脚本:

$ bash script.sh input output

注意输出:

$ cat output
AJirio_TR15329|c4_g1_i4|m.30470"AJirio"
AJama_TR16613|c5_g2_i2|m.30203"AJama"
AJkago_TR11651|c5_g2_i1|m.3847"AJkago"
AJtok_TR11413|c7_g1_i1|m.3527"AJtok"
Atab_TR15364|c0_g1_i1|m.4073"Atab"

相关内容