我有这个连续序列,我想每 200 个字符添加一个 \n 和一个 > 来分隔这些组。我想使用 sed 和 awk 可能会有所帮助,但我是新手。
这将是我的输入:
ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCATGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGTGAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA
这是我的预期输出(> 没有逗号):
>1
ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCA
>2
TGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGT
>3
GAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA
有什么建议吗?提前致谢
A。
答案1
您perl
可以将 RS 初始化为 \200,以便一次读取 200 个字节。假设您的文件具有与字节相同的字符。
$ perl -ne '
BEGIN { $/ = \200; $\ = "\n" }
chop if /\n/;
last if /^$/;
++$k; print s/^/>$k\n/r;
' file
答案2
使用用于多字符 RS 和 RT 的 GNU awk:
$ awk -v RS='.{200}' 'RT{print ">" NR ORS RT}' file
>1
ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCA
>2
TGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGT
>3
GAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA
答案3
确实避免潜在的繁重解析器和正则表达式的可能解决方案是以下管道,它应该适用于每个 UNIX 系统,因为它仅使用带有 XSI 选项的 POSIX 功能:
tr -d '\n' | dd cbs=200 conv=unblock | nl -n ln | tr '\t' '\n' | paste -d '>\n' /dev/null - -
您需要将文件提供给标准输入,例如通过cat file |
在命令前面添加存储在file
.
该命令用 删除尾随的换行符tr
,将行分成 200 字节的块,用制表符将左侧的数字与数据分开,对每行进行编号,由以下命令将其替换为换行符以使输出友好的,在数字前面paste
添加字符。>
答案4
使用 GNU awk
:
awk -v FPAT='.{200}' '{ while(++num<=NF) print ">"num RS $num; }' infile
上面的命令仅在您的行始终以 200 为模数时才有效,如果不是,并且小于或等于您将需要打印出剩余的字符,或者如果行也小于 200 个字符:
awk -v FPAT='.{200}' '{ while(++num<=NF) print ">"num RS $num; };
END{
if (length($0)%200)
print ">" num RS substr($0, int(length($0)/200)*200+1, length($0)%200);
}' infile