sed 是一种流编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在称为“模式空间”(pattern space)的临时缓冲区中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
生成联系文件
leadingsci@DELL5577:~/Test$ cat df.txt
Filesystem Size Used Avail Use% Mounted on
rootfs 119G 57G 62G 48% /
tmpfs 119G 57G 62G 48% /run
none 119G 57G 62G 48% /run/lock
none 119G 57G 62G 48% /run/shm
none 119G 57G 62G 48% /run/user
替换
s 表示替换,将制表符 \t 替换为 ,;默认只替换第一个匹配的制表符。若想匹配第二个,则:
leadingsci@DELL5577:~/Test$ sed 's/\s/,/2' df.txt
将第二列的G ,替换成为GB
leadingsci@DELL5577:~/Test$ sed 's/G/GB/2' df.txt
Filesystem Size Used Avail Use% Mounted on
rootfs 119G 57GB 62G 48% /
tmpfs 119G 57GB 62G 48% /run
none 119G 57GB 62G 48% /run/lock
none 119G 57GB 62G 48% /run/shm
none 119G 57GB 62G 48% /run/user
全部替换
g 即为 global,意为全局替换。
leadingsci@DELL5577:~/Test$ sed -e 's/G/GB/g' df.txt
Filesystem Size Used Avail Use% Mounted on
rootfs 119GB 57GB 62GB 48% /
tmpfs 119GB 57GB 62GB 48% /run
none 119GB 57GB 62GB 48% /run/lock
none 119GB 57GB 62GB 48% /run/shm
none 119GB 57GB 62GB 48% /run/user
删除
删除特定字符
删除n开头的字符
fasta中可以删除> 开头的字符
leadingsci@DELL5577:~/Test$ grep "^n" df.txt | sed 's/^n//'
one 119G 57G 62G 48% /run/lock
one 119G 57G 62G 48% /run/shm
one 119G 57G 62G 48% /run/user
# /g效果一致
leadingsci@DELL5577:~/Test$ grep "^n" df.txt | sed 's/^n//g'
one 119G 57G 62G 48% /run/lock
one 119G 57G 62G 48% /run/shm
one 119G 57G 62G 48% /run/user
删除空行
正则,^$ 表示空行,放在 // 中表示在文件中匹配空行;d 为 delete,即删除;所以整体的意思就是将空行删除。
leadingsci@DELL5577:~/Test$ sed '/^$/d' df.txt
Filesystem Size Used Avail Use% Mounted on
rootfs 119G 57G 62G 48% /
tmpfs 119G 57G 62G 48% /run
none 119G 57G 62G 48% /run/lock
none 119G 57G 62G 48% /run/shm
none 119G 57G 62G 48% /run/user
添加行
1i 表示在第一行之前插入一行(insertion),\t 表制表符。
1a 即在第一行之后追加一行(append)
leadingsci@DELL5577:~/Test$ sed '1iroot1\troot2\troot3\troot4' df.txt
root1 root2 root3 root4
Filesystem Size Used Avail Use% Mounted on
rootfs 119G 57G 62G 48% /
tmpfs 119G 57G 62G 48% /run
none 119G 57G 62G 48% /run/lock
none 119G 57G 62G 48% /run/shm
none 119G 57G 62G 48% /run/user
显示指定行
显示第二行
-n 表示,不处理的行,不打印;p 即 print,2p 表示打印第二行。
leadingsci@DELL5577:~/Test$ sed -n '2p' df.txt
rootfs 119G 57G 62G 48% /
显示指定区间内的行
第二到第四行
leadingsci@DELL5577:~/Test$ sed -n '2,4p' df.txt
rootfs 119G 57G 62G 48% /
tmpfs 119G 57G 62G 48% /run
none 119G 57G 62G 48% /run/lock
按一定规律显示指定的行
打印第一行,第五行,到最后一行
leadingsci@DELL5577:~/Test$ sed -n '1~4p' df.txt
Filesystem Size Used Avail Use% Mounted on
none 119G 57G 62G 48% /run/shm
打印第 1 行,然后跳过 4 行,打印第 5 行;如此循环到最后一行。在 fastq 中即为打印每条序列的 header。
$ zcat 1_SD_30_1.fq.gz | sed -n '1~4p' | head -n 5
2~4 和 p 之间可以加上替换操作
将每行第一个G替换为GB
leadingsci@DELL5577:~/Test$ sed -n '2~4s/G/GB/p' df.txt
rootfs 119GB 57G 62G 48% /
none 119GB 57G 62G 48% /run/user
$ zcat 1_SD_30_1.fq.gz | sed -n '1~4s/^@/>/p' | head -n 5
将fastq打印为fasta
$ zcat 1_SD_30_1.fq.gz | sed -n '1~4s/^@/>/p;2~4p' | head -n 5
>ERR569754.4 9L6V3M1:265:C06M9ACXX:3:1101:6568:1985 length=101
CAGCATCACATATTAGGCTTTATCCCTTTAAAGCAATATATTTTGAAATATCAATTATCATTTTCATTTATGGCCCGTAGGGCATTGCAGGGCACAACG
>ERR569754.7 9L6V3M1:265:C06M9ACXX:3:1101:10900:1974 length=101
TGCTGTTCATGGTGTTGTTGCTCTTGCTGTTGTTGTTGTTGCCCACGATGGGATCGCCGTTGATGGGGCCGTTAACGGGATTGCCATGAATCTTGGTGT
>ERR569754.18 9L6V3M1:265:C06M9ACXX:3:1101:1157:2083 length=101
删除空格即其后的内容:
$ zcat 1_SD_30_1.fq.gz | sed -n '1~4s/^@/>/p;2~4p' | sed 's/ .*//' | head -n 5
>ERR569754.4
CAGCATCACATATTAGGCTTTATCCCTTTAAAGCAATATATTTTGAAATATCAATTATCATTTTCATTTATGGCCCGTAGGGCATTGCAGGGCACAACG
>ERR569754.7
TGCTGTTCATGGTGTTGTTGCTCTTGCTGTTGTTGTTGTTGCCCACGATGGGATCGCCGTTGATGGGGCCGTTAACGGGATTGCCATGAATCTTGGTGT
>ERR569754.18