美文网首页
【linxu编程】Linux文本处理三剑客——sed

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

作者: leadingsci | 来源:发表于2017-12-27 22:16 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/zoppgxtx.html