【linxu编程】Linux文本处理三剑客——sed

【linxu编程】Linux文本处理三剑客——sed_第1张图片

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

你可能感兴趣的:(【linxu编程】Linux文本处理三剑客——sed)