我需要修改一个有 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'
将连接分隔符设置为换行符,而不是默认的制表符