Linux学习 - SED操作,awk的姊妹篇

awksed想一对兄妹,一个出现,就会问起另一个。现在,都来了。

sed基本参数解释

sed是stream editor的简称,擅长对文件进行各种正则操作、插入操作、替换操作和删除操作,可以全局,可以指定特定范围的行或者特定特征的行。

s/pat/replace/: 正则替换

前插行i, 后插行a, 替换行c, 删除行d, 输出行p

N: 读入下一行,同时存储;n:读入下一行,抛弃当前行

常见操作

  • 替换特定的文本
ct@ehbio:~/SXBD$ cat mat
ID    2 cell    4 cell    8 cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc    2    3    4    5
Tet1_3    2    3    4    5
ct@ehbio:~/SXBD$ sed 's/ /_/' mat 
ID    2_cell    4 cell    8 cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc    2    3    4    5
Tet1_3    2    3    4    5
ct@ehbio:~/SXBD$ sed 's/ /_/g' mat 
ID    2_cell    4_cell    8_cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc    2    3    4    5
Tet1_3    2    3    4    5
  • 获得逗号分隔的一组数
ct@ehbio:~/SXBD$ echo `seq 1 10` | sed 's/ /,/g'
1,2,3,4,5,6,7,8,9,10
  • 针对指定行替换
ct@ehbio:~/SXBD$ sed '2,$ s/_[0-9]//g' mat 
ID    2 cell    4 cell    8 cell    embryo
Pou5f1    2    3    4    5
Nanog    2    3.2    4.3    5
c-Myc    2    3    4    5
Tet1    2    3    4    5
  • 替换特定出现位置
# 替换第一个空格
ct@ehbio:~/SXBD$ sed 's/ /_/1' mat 
ID    2_cell    4 cell    8 cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc    2    3    4    5
Tet1_3    2    3    4    5
# 替换第二个空格
ct@ehbio:~/SXBD$ sed 's/ /_/2' mat 
ID    2 cell    4_cell    8 cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc    2    3    4    5
Tet1_3    2    3    4    5
# 替换第二个及以后的空格
ct@ehbio:~/SXBD$ sed 's/ /_/2g' mat 
ID    2 cell    4_cell    8_cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc    2    3    4    5
Tet1_3    2    3    4    5
  • 给序列起名字
ct@ehbio:~/SXBD$ cat seq
ACDGTFGGCATGCDTGD
ACDGAGCDTAGCDGTA
CAGDTAGDCTADTG
ct@ehbio:~/SXBD$ sed = seq
1
ACDGTFGGCATGCDTGD
2
ACDGAGCDTAGCDGTA
3
CAGDTAGDCTADTG
# 同时缓冲两行,但只对第一行行首操作
ct@ehbio:~/SXBD$ sed = seq | sed 'N;s/^/>/;'
>1
ACDGTFGGCATGCDTGD
>2
ACDGAGCDTAGCDGTA
>3
CAGDTAGDCTADTG
  • 给文件增加标题行
ct@ehbio:~/SXBD$ tail -n +2 mat | sort -k2,2n
c-Myc    2    3    4    5
Nanog_1    2    3.2    4.3    5
Pou5f1_1    2    3    4    5
Tet1_3    2    3    4    5

# 1 表示第一行
# i 表示插入,在指定行前面插入新行
ct@ehbio:~/SXBD$ tail -n +2 mat | sort -k2,2n | sed '1 i ID\t2_cell\t4_cell\t8_cell\tembryo'
ID    2_cell    4_cell    8_cell    embryo
c-Myc    2    3    4    5
Nanog_1    2    3.2    4.3    5
Pou5f1_1    2    3    4    5
Tet1_3    2    3    4    5
  • 提取特定或指定范围的行
# -n是必须的,阻止程序自动输出匹配行,不然会导致重复输出
ct@ehbio:~/SXBD$ sed -n '2,4p' mat
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc    2    3    4    5
ct@ehbio:~/SXBD$ sed -n '4p' mat
c-Myc    2    3    4    5
  • 提取符合特定模式的行
ct@ehbio:~/SXBD$ sed -n '/_/ p' mat
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
Tet1_3    2    3    4    5
ct@ehbio:~/SXBD$ sed -n '/-/ p' mat
c-Myc    2    3    4    5
  • 去除文件中的空行
ct@ehbio:~/SXBD$ cat mat
ID    2 cell    4 cell    8 cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5

c-Myc    2    3    4    5
Tet1_3    2    3    4    5
# 空行就是只有行首和行尾的行
ct@ehbio:~/SXBD$ sed '/^$/d' mat 
ID    2 cell    4 cell    8 cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc    2    3    4    5
Tet1_3    2    3    4    5
  • 原位删除
ct@ehbio:~/SXBD$ cat mat
ID    2 cell    4 cell    8 cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5

c-Myc    2    3    4    5
Tet1_3    2    3    4    5

# -i 参数的使用
ct@ehbio:~/SXBD$ sed -i '/^$/d' mat 
ct@ehbio:~/SXBD$ cat mat
ID    2 cell    4 cell    8 cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc    2    3    4    5
Tet1_3    2    3    4    5
  • 删除指定范围的行
ct@ehbio:~/SXBD$ cat mat
ID    2 cell    4 cell    8 cell    embryo
Pou5f1_1    2    3    4    5
Nanog_1    2    3.2    4.3    5
c-Myc_2    2    3    4    5
Tet1_3    2    3    4    5

ct@ehbio:~/SXBD$ sed '2,3d' mat
ID    2 cell    4 cell    8 cell    embryo
c-Myc_2    2    3    4    5
Tet1_3    2    3    4    5
  • 记忆匹配

\(\)启动记忆匹配;\1为第一个匹配项,\2为第二个匹配项;匹配项的计数根据左括号出现的位置来定,第一个(包括起来的为\1

ct@ehbio:~/SXBD$ echo "hah ehbio hah" | sed 's/ \(.*\) /\t\1\t\1\t/'
hah    ehbio    ehbio    hah
  • 奇偶数行处理
ct@ehbio:~/SXBD$ echo -e "odd\neven\nodd\neven"
odd
even
odd
even

# 奇偶数行合并
ct@ehbio:~/SXBD$ echo -e "odd\neven\nodd\neven" | sed 'N;s/\n/\t/'
odd    even
odd    even

# 取出偶数行,比较简单
# 注意 n (小写)撇掉了奇数行
ct@ehbio:~/SXBD$ echo -e "odd\neven\nodd\neven" | sed -n 'n;p'
even
even

# 取出奇数行
# 先都读进去,然后替换偶数行为空值,再输出
ct@ehbio:~/SXBD$ echo -e "odd\neven\nodd\neven" | sed -n 'N;s/\n.*//;p'
odd
odd
  • Windows/Linux换行符困境

Windows下的换行符是\r\n, Linux下换行符是\n, MAC下换行符是\r。所以Windows下的文件拷贝到Linux后,常会出现行尾多一个^M符号的情况,从而引起匹配或其它解析问题。

^M的输是 ctrl+v+M ctrl+v;ctrl+m,不是简单的输入^,再输入M

ct@ehbio:~/SXBD$ cat -A windows.txt 
ID^M$
A^M$
B^M$
C^M$
ct@ehbio:~/SXBD$ sed 's/^M//' windows.txt | cat -A
ID$
A$
B$
C$
  • sed中使用bash变量
# 注意双引号的使用
ct@ehbio:~/SXBD$ bash_variable='ehbio'
ct@ehbio:~/SXBD$ echo "sheng xin bao dan " | sed "s/$/$bash_variable/"
sheng xin bao dan ehbio

正则表达式不同语言略有差别,但整体相近,更多正则操作见:不用Linux也可以的强大文本处理方法

原文发布于微信公众号 - 生信宝典(Bio_data)

原文发表时间:2017-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【专业技术第十三讲】指针和内存泄露

存在问题: 指针是大家最为头痛的问题,也是程序bug中较难解决的错误,什么情况下会导致内存泄露? 解决方案: 引言 对于任何使用C语言的人,如果问他们C语言...

36580
来自专栏chenssy

【死磕Java并发】—–Java内存模型之重排序

在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改...

26660
来自专栏WD学习记录

牛客网 构建乘积数组

给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+...

15820
来自专栏我爱编程

Day14IO编程

读文件 Python引入了with语句来自动帮我们调用close()方法: with open('/path/to/file', 'r') as f: ...

33350
来自专栏java架构师

Unit断言学习

[TestMethod]—用于把一个方法标记为一个测试方法。当你运行你的测试时,仅标记有这个属性的方法才能够运行。 [TestClass]—用于把一个类标记为...

278110
来自专栏芋道源码1024

【死磕Java并发】—– Java内存模型之重排序

在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改...

38070
来自专栏有趣的Python和你

循环与判断判断循环

10120
来自专栏C语言及其他语言

C 语言中的指针和内存泄漏

原文出处: IBM developerworks 引言 对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄...

51940
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版3.3节函数参数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

8410
来自专栏orientlu

std::sort coredump 说起

c++ 标准库 sort() 默认采用 < 这个 operator 来排序的, 另个一个重载函数增加第三个参数,指定一个比较的函数,函数接受两个参数。 对于基...

19430

扫码关注云+社区

领取腾讯云代金券