Linux笔记【009】| 文本操作神器
一.常见查看文件命令
1.cat 与tac命令
cat 命令用于连接文件并打印到标准输出设备上。
语法格式:cat [-AbeEnstTuv] [--help] [--version] fileName
参数说明:
-n 或 --number:由 1 开始对所有输出的行数编号。
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
-s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
-v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
-E 或 --show-ends : 在每行结束处显示 $。
-T 或 --show-tabs: 将 TAB 字符显示为 ^I。
-A, --show-all:等价于 -vET。
-e:等价于"-vE"选项;
-t:等价于"-vT"选项;

tac的功能是将文件从最后一行开始倒过来将内容数据输出到屏幕上。我们可以发现,tac实际上是cat反过来写。

2.head与tail命令
head和tail通常使用在只需要读取文件的前几行或者后几行的情况下使用。
head 命令查看文件头部, -n 选项可以指定查看前几行。

tail 命令查看文件尾部, -n 选项可以指定查看后几行。

3.more与less命令
more的功能是将文件从第一行开始,根据输出窗口的大小,适当的输出文件内容。当一页无法全部输出时,可以用“回车键”向下翻行,或者使用“空格键”向下翻页。退出查看页面,请按“q”键。
more /root/BioInfoData/gencode.v35lift37.annotation.gtf/gencode.v35lift37.annotation.gtf
less的功能和more相似,但是使用more无法向前翻页,只能向后翻。less可以使用【pageup】和【pagedown】键进行前翻页和后翻页,这样看起来更方便。less 命令用来查阅文档,功能更为强大。
less /root/BioInfoData/gencode.v35lift37.annotation.gtf/gencode.v35lift37.annotation.gtf参考:https://www.cnblogs.com/machangwei-8/p/9570550.html
4.paste命令
用来将多个文件的内容合并,与 cut 命令完成的功能刚好相反。
具体用法:
paste [-s][-d <间隔字符>][--help][--version][文件...]
参数:
-d, --delimiters=列表 改用指定列表里的字符替代制表分隔符
-s, --serial 不使用平行的行目输出模式,而是每个文件占用一行
--help 显示此帮助信息并退出
--version 显示版本信息并退出
首先确保两个文件行数相同。paste指令会把每个文件以列对列的方式,一列列地加以合并将每个指定文件里的每一行整合到对应一行里写到标准输出,之间用制表符分隔。如果没有指定文件,或指定文件为"-",程序将从标准输入读取数据。paste 连接文件时,除非指定 -d 选项,否则默认用 空格 或 tab键 分隔文本。
# touch exp1# touch exp2创建2个文件,exp1和exp2,并自己输入类似的数据。

paste ./temp/info1.txt ./temp/info2.txt
5.cut命令
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。
其语法格式为:
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。
cut命令主要是接受三个定位方法:
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f
案例:

其实cut的-d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了。

参考:https://blog.csdn.net/zsf8701/article/details/7718680
二.文本处理的2大神器
关于文本操作命令,前面已经介绍了一部分,这里介绍处理文本的三大神器。
1.grep 匹配
grep:一种强大的文本搜索工具,能使用正则表达式匹配模式搜索文本,并把匹配的行打印出来。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。grep 处理速度非常之快,尽量使用这个命令处理文本。不了解正则表达式,需要去补充一下知识。
知道正则表达式以后,我们就更加容易掌握grep,语法格式如下:
grep [options] pattern file常用参数:
-v 反向选择,即输出没有没有匹配的行
-n 显示匹配成功的行所在的行号
-c 统计匹配成功的行的数量
-w 完全匹配
-o 只输出匹配的内容
-f 从文件中读取pattern
-e 指定多个匹配模式
其他参数:
-a 或 --text : 不要忽略二进制的数据。
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c 或 --count : 计算符合样式的列数。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i 或 --ignore-case : 忽略字符大小写的差别。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-q 或 --quiet或--silent : 不显示任何信息。
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-s 或 --no-messages : 不显示错误信息。
-v 或 --revert-match : 显示不包含匹配文本的所有行。
-V 或 --version : 显示版本信息。
-w 或 --word-regexp : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定"-i"参数相同。
继续用上面的文件演示。在info1.txt文件中查找Bio

我们搜索“Bio”。搜索出来的结果会标红。
查看一下gtf文件内容的前6行:
head -6 ./temp/gencode.v35lift37.annotation.gtf
关于gtf文件可以参考其他公众号的文章:生信中常见的数据文件格式
我们上面搜索的gene,把含有gene字母的字符串也搜索出来啦,比如:gene_id,假如我们只希望出现gene_id这个单词的结果,那就加上-w参数.
grep -wc gene_id ./temp/gencode.v35lift37.annotation.gtf
可以看到gene就是唯一的精确匹配结果。载加上-c这个参数,返回匹配的结果行数。
grep -wc gene_id ./temp/gencode.v35lift37.annotation.gtf查找匹配结果反选:
grep -v gene_id ./temp/gencode.v35lift37.annotation.gtf
我再演示一下正则表达式的检索模式,我们检索一下以B开头的行。

要怎么匹配,就按照正则表达式书写匹配模式就行啦。
2.sed流编辑器
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
(1)sed命令的格式
sed 选项 '动作' 文件名 (【sed [-opitons] 'script' file(s)】
cat 文件名 | sed 选项 '动作'
选项:
-n :只显示被修改的行的内容
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作:匹配模式 '/pattern/ command'
a:在指定行后新增一行或多行内容
c:替换指定行的内容
d:删除指定行的内容
i :在指定行之前 插入一行或多行内容
s:替换指定内容,【格式】 :s/pattern/replacement/[flags],【flags】 数字:新文本替换第几处模式匹配的文本g(global) :新文本将替换所有匹配到的文本
p:(print)打印
w:(write)
r:(read)
= :打印行号
y:转换
(2)删除行内容
删除第4行的内容
sed "4d" ./temp/info1.txt
删除第2-4行的内容
sed '2,4d' ./temp/info1.txt删除第3行到最后一行的内容
sed '3,$d' ./temp/info1.txt
在第2行后新增内容
sed '2a YunSen' ./temp/info1.txt
在第3行前插入内容
sed '3i YunSen' ./temp/info1.txt
把第3行的内容替换为Student
sed '3c Student' ./temp/info1.txt
(3)搜索指定内容
搜索含有Bio的行
sed -n '/Bio/p' ./temp/info1.txt搜索并删除指定内容
sed '/root/d' ./temp/info1.txt
(4)替换指定内容
默认只替换每行中模式首次匹配的内容
sed 's/yunsen/'YunSen'/' ./temp/info1.txt
g标记可以使sed执行全局替换
sed 's/o/'O'/g' ./temp/info1.txt
g标记可以使sed替换第N次即以后出现的匹配
sed 's/o/O/2g' ./temp/info1.txt
(5)直接操作文件内容(危险动作)
直接删除文件内容
sed -i '3d' ./temp/info1.txt直接替换文件内容
sed -i 's/yunsen/YunSen/g' ./temp/info1.txt(6)在sed中使用正则表达式
搜索并删除空行
sed '/^$/d' ./temp/info1.txt参考文章:https://www.cnblogs.com/lfjn/p/11455970.html
除了上面2 个工具外,还有一个awk工具,awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。这个工具后面再介绍。
参考文章:
1.https://www.cnblogs.com/lfjn/p/11455970.html
2.https://blog.csdn.net/zsf8701/article/details/7718680
3.https://www.cnblogs.com/lfjn/p/11455970.html
