从一个看起来像这样的文件:
(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"