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 的神秘简写。
使用一个简单的循环:
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)