使用 awk 更改和操作文件中的行

使用 awk 更改和操作文件中的行

我有一个具有以下格式的文件

>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输入记录以进行进一步处理。比用headera\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

相关内容