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

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

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

CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

我想要获得这个:

>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

答案1

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

$ sed = file | sed '1~2 s/^/>seq/'
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

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


另一方面,如果你提前知道有 770 行,那么你可以这样做

printf ">seq%d\n" {1..770} | sed 'R file'

尽管这依赖于 GNU sedR扩展:

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

当然,如果你事先不知道行数,你可以

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

但这样就失去了只需读取文件一次的优势。


实际上我可能会使用@John1024 的 awk 解决方案或其 perl 等效项

perl -lpe 'print ">seq" . $.' file

答案2

您的任务可以用 sed 完成,但 sed 缺乏对算术的任何原生理解,因此它不是一个合适的工具。Awk 效果很好:

$ awk '{print ">seq" NR} 1' file
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

怎么运行的:

  • print ">seq" NR

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

    NR是 awk 的行计数器。

  • 1

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

答案3

使用一个简单的循环:

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

输出:

>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

答案4

使用paste

 paste -d '\n' <(seq -f '>seq%g' 1 4) file
  • seq -f '>seq%g' 1 4将换行符分隔的数字写入标准输出
  • <(...) 是过程替代
  • paste将每个文件的相应行连接起来,用分隔符分隔
  • -d '\n'将连接分隔符设置为换行符,而不是默认的制表符

相关内容