我有一个具有以下格式的文件
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT-ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT-GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA-CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA-GAGGTAGAAGGTGCAGTGGGGA
我想操作和更改这些行,以便将第二行分成两行,用“-”分隔成一个新行,并将“>”标识之前的名称复制到新行中,并在末尾由 _2 重命名名称,如下;
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307_2
ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307_2
GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307_2
CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307_2
GAGGTAGAAGGTGCAGTGGGGA
我知道这可以通过 awk 完成,但我想不出任何办法。
答案1
既然您专门询问了“使用 awk”
awk -F- '
/^>/ {hdr=$0; next}
{print hdr ORS $1; for(i=2;i<=NF;i++) print hdr"_"i ORS $i}
' file
答案2
捕获以>
in开头的行header
并转到next
输入记录以进行进一步处理。比用header
a\n
和第 1 列打印一行新的输入记录。然后对第二列重复此操作,并将 2 添加到标题中。
$ awk -F- '/^>/{header=$0; next}{print header ORS $1; print header"_2" ORS $2}' file
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307_2
ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307_2
GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307_2
CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307_2
GAGGTAGAAGGTGCAGTGGGGA
答案3
Perl 来救援
perl -laF/-/ -ne '
if (/^>/) { print; $header = "$_\_2"; }
else { print join "\n", $F[0], $header, $F[1] }
' -- input-file
-n
逐行读取输入-l
从输入中删除换行符并将其添加到print
语句中-aF/-/
将输入拆分为-
当读取标题行时,它会将其输出并存储标题以供以后使用。处理序列时,它会打印第一部分、存储的标头和第二部分。
答案4
如果您想自助,但不想学习编程,您可以使用sed
.您只需始终使用 读取下一行N
,将双行分成由 包围的部分()
,并根据需要组合第一行所引用的部分,\1
依此类推:
sed -E 'N;s/(.*)(\n)(.*)-(.*)/\1\2\3\2\1_2\2\4/' file
您也可以在不扩展正则表达式的情况下执行此操作(无选项-E
),但您可能会迷失在反斜杠中:
sed 'N;s/\(.*\)\(\n\)\(.*\)-\(.*\)/\1\2\3\2\1_2\2\4/' file
通过使用保持缓冲区实现相同的结果,但如果您是新手,则效果不太明显sed
:
sed 'h;n;y/-/\n/;P;s/.*\n//;x;s/$/_2/;G' file