linux命令行文本操作一文就够

主要是 这三驾马车,加上vi这个神器,最后辅助一些小工具,包括

这里 简要地整理下Linux用来处理数据文本的工具。具体命令详情请在Linux命令大全中搜索或者查阅其他相关资料。

, 查看文档头尾。 选项可以指定行数。

用来查阅文档, 退出, 翻页, 第一行, 最后一行, 下, 上, 往下搜索模式, 往上搜索模式, 前一个匹配字符, 后一个匹配字符。

可以用于debug,查看中间输出结果。比如

可以写为

这样就可以一步步的查看中间结果啦~

同理还有 命令, 命令也可以查看文本。

纯文本信息汇总

命令默认依次输出单词数、行数、总字符数。查看行数使用 。 如果存在空行,空行会被计数。可以使用 命令实现非空行计数

以易读形式查看文件大小。

输出文件列数:

怎么去除注释的元数据行呢?怎么计数非注释行行数呢?

可以使用 结合 ,试试gtf(基因组注释文件)

可以看到注释行是5行,我们利用 试试去掉它

发现还有一行没去掉

成功搞定,然后结合前面提到的 命令即可计算行数。

上面方法鲁棒性不够(人为地确定行数),一种更为通用的方法是 结合 命令

推荐使用这种。

cut 详解

可以处理列数据, 选项指定列,可以是一个范围(比如2-8),注意不能用它给列排序。

选项可以指定分隔符,比如 指定 为分隔符。

使用 命令来格式化输出,上次的命令结果输出明显没对齐,我们把它对齐看看:

注意,使用这个命令是为了好观察,不要把用它处理然后把结果传入文本(会导致程序处理文件效率降低,因为文本解析速度会下降)。

和 默认以 为分隔符,这里也能够用 选项指定。

先把之前的tab分隔文件弄成逗号分隔文件,然后使用 选项看看:

grep 简单了解

处理速度非常之快,能用它尽量用它。 可以激活颜色(标记匹配文字),更方便查看。

选项排除匹配到的, 进行完全匹配。这样可以防止,你想排除 结果把 , 也排除掉了。

指定输出包括匹配到的前多少行,比如 就是前一行; 指定输出包括匹配到的后多少行,比如 就是包括了后两行。 指定输出包括匹配到的前后多少行。 支持基本正则表达式, 指定支持扩展表达式,或者用 命令。 选项对匹配的行计数; 选项只抽离输出匹配的部分

发现冗余项非常多,如果我们只要唯一的呢,怎么办?

虽然我的笔记本呼啦啦作响,但是还是非常快就跑完了。

file查看文件编码

常用的大型数据文件一般存为ASCII码形式(像几大基因bank的数据文件),而我们自己认为创建的常为UTF-8,所以有时候认为处理文件需要会碰到把UTF-8编码的字符插入到ASCII码文件里去了。遇到这种问题,我们可以用 命令查看出错的地方(手边没有这样的文件,就不举例了)。

用sort对文本排序

我们先创建一个bed格式文件来试试这个命令:

可以明显看到文本按照第一列进行了排序。 默认, 用空格或tab键作为域(列)分隔符。如果我们用其他形式的分隔符,需要用 选项指定。

下面是对 文件最通用的排序命令:

基本操作 软件都会先用这个命令对 文件排序。 现在略加解释一下, 用 选项指定某列的排序方式。而每次使用 选项都要带上指定列的范围(start, end)。如果只指定一列,就为(start,start)了,像上面命令的 就是。也许你会觉得 很奇怪,这里的 指定程序把第二列当做数值对待。如果不做设定,都是当做字符对待(shell都是这么对待数值数据的)。所以总结其他这一行命令就是对第一列按照字符排序,第二列按照数值排序。

我们可以用 选项检查一个文件是不是已经按照过某种方式排过序了。

上面可以清楚地看到 是怎么对待文件的(一般shell返回0表示成功执行)。

shell的命令退出状态码表示了该命令执行的完成的某种情况。不同的状态码有不同的含义,具体可以百度查阅(我之前整理的shell笔记应该讲过,可以看看)。

反向排序用 选项。如果你只想反转一列,可以把它加在 选项后。

现在我给 加一行:

你会发现有点奇怪

怎么 在 前面?其实 排序的方式有点像查字典。例子中,命令先比较 ,然后比较 ,然后比较 ,接着比较 ,自然 会在 前面了。这里可以添加 选项修改。

是不是觉得这样更可观一些?不过通常在处理数据时不做此处理,符合 规范的数据可以让后续处理程序效率更高。

基本掌握 这些也够用了,它主要为后续处理服务。如果想知道其他的用法,查查吧,同时欢迎发文来交流。

用uniq寻找唯一值

首先创建样例文本

使用 看看

尼玛,怎么不对。它好像只去掉了连续的同一字符。怎么办?想想我们刚学了什么命令? 不是刚好可以把同样的字符弄到一起去吗,然后再使用 ,嘿嘿:

哟呵,got you。

加 选项计数:

把结果再排序

选项只输出重复行

使用时需要注意处理不同导致的结果差异。

Join 命令

用来连接文件。 假设现在我们有两个文件:

我想把第二个文件说明染色体长度添加到第一个文件对应染色体的第三列。 我们首先要给文件排序(使用 前必须做),然后使用 命令。

命令基本语法是

既然名字叫 ,就是两者必须有共同之处,通过共同的支点将两者连为一体。 和 选项后接参数分别指定了这个支点,也就是连接的域(列)。比如例子中,都是两个文件的第一列。

两个文件中,第一列都共有 。 如果不一致会出现什么情况呢?

如果第二个文件没有 , 之后也没了!!

我们可以通过 选项指定哪一个文件可以不遵循配对

awk 可以说是一门语言了

是文本处理的一把好手,虽然它不能像 , 干一些高级复杂的主题工作,但是它具备完整的命令操作和编程体系。

首先要明白的是, 按行处理数据。在shell知识里,如果把一个文档看做一张表。那么一行就是一个记录,一列就是一个。可以看出, 就是按记录处理文本的。

其次是 的程序结构是

pattern可以是表达式或者正则表达式。pattern有点像 语句,当它满足时就会执行相应的动作。

另一个 核心是它用$0 ,$2`...等等表示对应的列。我们可以很方便地用它进行操作。

语句就像动作一样输出你操作的结果。

了解上述几个语句的不同。

表示染色体名一般用带 或者不带 标志两种方式。当我们要用到这两种时,肯定要让它们能够对应起来,也就是转换。 命令可以非常方便地添加 标记。

下面我先把例子文件的 去掉,然后加上试试。

作为一门编程语言,它支持各种操作符(运算,逻辑,判断)喔。

还有 存在一些变量,像 表示行号, 表示输出分隔符等。

如果我们想把 文件转换成为 格式,可以使用

因为篇幅有限,我不可能输出所有结果,所以只取部分数据做了运算。

用sed进行流编辑

sed工作流:读取$\to$执行命令$\to$显示。默认情况,所有的命令都会一个叫做在模式空间(pattern buffer)的缓冲区进行。因此不会改变原始输入文件的内容。

语法规则

sed即支持在命令行中用单引号输入执行命令,也支持执行含有sed命令的文件。使用方式如下:

选项

sed 后面首先需要跟参数,支持的参数有:

选项与参数: -n :禁止显示所有输入内容,只显示经过sed处理的行(常用) -e :直接在命令列模式上进行 sed 的动作编辑,接要执行的一个或者多个命令 -f :执行含有sed 动作的文件 -r :sed 的动作支持的扩展正则(默认基础正则) -i :直接修改读取的文件内容,不输出。

作用区域

默认情况下,sed命令会作用于文本数据的所有行。如果只想作用于某些行时,则需要使用在命令通过行号或者文本过滤的方式前指明作用区域。

行号

使用数字行号时,类似于R中的向量子集提取。单独数字表示某一行,逗号分割指示行范围,另外 表示从m行开始向下n行, 表示从m行开始的每n行。

例如 输出偶数行, 输出奇数行内容。

文本过滤

可以只在包含pattern 的行中执行命令。如 只会打印出包含hello的行。 打印两者之间的所有行。

特殊情况下也可以将文本过滤和行号结合使用, 打印第一次出现hello的下面5行

命令

p 复制

复制模式空间中的内容,如果不和 参数连用,每一行都会在屏幕输出两次,一行正常输出一行复制,结合 参数后就可以打印需要的内容。

d 删除

没什么可以说的,支持按照行号或者匹配来删除。

i 插入

有的时候一个结果文件没有header,使用sed 可以轻松完成。在匹配位置之前插入内容。

a 追加

和插入命令的区别在于在匹配位置后一行插入内容,,如果想在末尾插入一行信息时将$作为地址。

c 行替换

有了行的删除插入和追加自然也就会有行替换。

y 字符转换

sed中的y命令可以实现一一映射的字符替换(注意和s命令的区别)。

l 输出隐藏字符

类似与cat -A,但是显示隐藏字符形式不同。

w 写入新文件

增强版的cp,只复制自己想要的东西,也可以将一个文件按不同的筛选条件分开保存。

r 读取文件

如果现在a文件的某个地方插入b文件,如在第三行插入

e 执行外部命令

首先要区别于参数-e,这个e是在''里面的命令

i 反向执行

在命令前加!反向执行命令

n 匹配行下移一行操作

提前读取当前行的下一行内容,并且覆盖当前模式空间中的行

= 打印行号

s 替换

通用写法

这里pattern部分支持正则匹配,flags包括n(替换第n个匹配项),g(全局替换),p(输出改变的行,结合-n),i(忽略大小写匹配),w(保存改变的行到新文件)。

如果要替换的的内容包括了 ,第一种方式是使用 进行转义,第二种方法是使用 作为分隔符。

有时候我们会对文件中的目录进行替换,可以下面的写法

pattern支持各种正则表示法,例如

在进行匹配替换时,我们有时候并不想删除匹配的内容,只是希望其以另一种形式和替换内容一起出现。在sed中,特殊字符 用来存储匹配模式中的内容。

例如

sed 单行命令 可以完全替代上面所有的命令。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171214G0BYXX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券