如何使用sed为每一行插入不同的标题?

Ida*_*jas 7 command-line sed awk text-processing

我需要修改一个 770 行的文本文件,并为每个文件添加一个不同的标题,例如,我有这个:

CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
Run Code Online (Sandbox Code Playgroud)

我想获得这个:

>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 13

由于您特别要求 sed 解决方案(我不建议实际这样做 - 但您可以):

$ sed = file | sed '1~2 s/^/>seq/'
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
Run Code Online (Sandbox Code Playgroud)

第一次调用sed = file插入裸行号,然后第二次调用通过在>seq字符串前面添加来装饰它们。


OTOH 如果您提前知道有 770 行,那么您可以这样做

printf ">seq%d\n" {1..770} | sed 'R file'
Run Code Online (Sandbox Code Playgroud)

虽然这依赖于 GNU sedR扩展:

R filename
将要读取的一行文件名排队,并在当前循环结束时或读取下一个输入行时插入到输出流中。请注意,如果无法读取文件名,或者到达其末尾,则不会附加任何行,也不会出现任何错误指示。

当然,如果你不知道提前的行数,你可以这样做

printf ">seq%d\n" $(seq 1 "$(wc -l < file)") | sed 'R file'
Run Code Online (Sandbox Code Playgroud)

但这将失去只需要读取一次文件的优势。


在实践中,我可能会使用@John1024 的 awk 解决方案或其 perl 等价物

perl -lpe 'print ">seq" . $.' file
Run Code Online (Sandbox Code Playgroud)


Joh*_*024 12

你的任务可以用 sed 完成,但 sed 缺乏对算术的任何原生理解,这使它成为错误的工具。awk 运行良好:

$ awk '{print ">seq" NR} 1' file
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • print ">seq" NR

    对于读取的每个新行,我们首先打印您想要的标题。

    NR 是 awk 的行计数器。

  • 1

    这是 awk 对 print-the-line 的神秘简写。

  • 我打算推荐 awk (3认同)

Rav*_*ina 5

使用一个简单的循环:

count=1; while read -r line ; do printf '>seq%d\n%s\n' $((count++)) "$line"; done < file
Run Code Online (Sandbox Code Playgroud)

输出:

>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
Run Code Online (Sandbox Code Playgroud)