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

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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文承接之前写的三十分钟学会AWK一文,在学习完AWK之后,趁热打铁又学习了一下SED,不得不说这两个工具真的堪称...
    mylxsw阅读 9,897评论 3 74
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 14,407评论 2 33
  • Sed工具工作原理及特性 1. sed是流编辑器,每一次读取一行到内存中,即称之为模式空间(pattern spa...
    魏镇坪阅读 13,758评论 0 12
  • sed与awk实例 文本间隔 在每一行后面增加一空行 将原来的所有空行删除并在每一行后面增加一空行。这样在输出的文...
    stuha阅读 5,960评论 0 20
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 4,829评论 0 0

友情链接更多精彩内容