[生信技能树线下]Linux课堂回顾

Linux部分一直是我心头的大山,感觉很难翻过去了,那么学习愚公,一勺一勺的慢慢挖吧。

先从复习和回顾课堂上的内容开始。

文件目录命令

  • mkdir 创建文件夹/目录
    • -p 建立多层目录 mkdir -p test1/test2/test3
  • cd 目录切换
  • ls 目录展示
  • tree 树形展示
    • -d 只看目录
    • -L num 显示num层目录
  • touch 创建文本 一般用它来判断该目录的写入权限
    • touch new.txt
  • rm 删除文件
    • rm -r 递归删除,删除目录
    • rm -i 搞不清楚有没有删错前可以加上 删除前询问
  • cp 复制/拷贝
    • cp -i 覆盖前询问
    • cp -r 复制目录及其内所有项目
    • 目标路径必须提前建好,不带有新建目录的功能
  • less 查看大文本
    • -S 大写 单行显示,看表达矩阵是方便对齐
    • -N 大写 加编号
    • less之后的操作不会改变原文本
  • vim 编辑文本
    • 进入编辑器后,我们先按i,即切换到“插入”状态。就可以通过上下左右移动光标,或空格、退格及回车等进行编辑内容了。
    • ESC退出编辑模式
      shift+q 进入命令模式
    • 在冒号后面写 q退出, w保存
      wq 或者x:写入并退出
    • q!:不保存退出
    • !:直接退出
  • cat 输出/入(小)文本/查看小文本
    • cat > newfile
    • cat file
  • head 展示文件前几行
    • head -n 3 file
  • tail 展示文件后几行
    • tail -n 4 file
  • mv 移动文件/目录
    • 也是不能新建目录
  • > 重定向
  • >>追加 通常用追加,避免覆盖清空原文件
  • |管道符
  • history查看历史命令
    • history | rail -n 5 > history.txt
  • ln 建立链接,相当于创建快捷方式
  • 查看帮助文档 -- help (两个-)

进阶命令一

  • cut 文件切割,配合管道符内容使用
    • -d 定义分隔符,默认为\t
    • -f 制定分割后输出第几列
    • eg less -S | annotation.gtf.gz | cut -f 1,3-5 | less -S
  • paste 粘贴,文本按列合并,默认分隔符是\t
    • -s 文件按行合并
  • sort 排序
  • uniq 去除重复行
  • find 寻找文本/目录
  • tr
    • 注意tr [atcg] [tcga] 是把“a换成t,t换成c,c换成g,g换成a“,而不是字符串atcg去匹配
  • wc 计算文本大小,行数,字符数

进阶命令二

三大命令:sed, grep, awk

sed

个人理解:编辑文本,"替换",按条件打印包含模版的行

崔老师的讲解:https://www.jianshu.com/p/1a853a0315d5

可依照script的指令,来处理、编辑文本文件。 多用于对文本的行来操作,
常见 sed [option] 's///g' tmp.txt

为了方便理解,走一遍动作说明的代码,然后写出解释:

echo 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0|sed 's/Bcast.*$//g'

返回了192.168.1.100。输入到截止"Bcast"前面的内容

由于输出内容很多,密密麻麻的,替换的地方可能察觉不到,建议眼花如我的都先不要sed,看看原始的长什么样子,然后截屏比较命令的差别。

编辑文本,替换

nl /etc/passwd |sed 's/:/\t/'|less -S

把":"分割成"tab",只替换第一个。

**如果要全部都替换则加上gsed 's/:/\t/g' **

nl 表示给列出的内容加上行号

nl /etc/passwd |sed '4,$s/:/\t/'|less -S

s和g分别表示开始和结束所以这里表示从第4行到最后一行(4,$)执行上述替换

nl /etc/passwd | sed -e 's/root/#####/' -e 's/qmcui/###!!!/'|less -S

-e:表示多次使用sed,这句里面执行了两个替换:root换成#####,qmcui换成###!!!

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'

删除3-最后一行,d表示删除动作;然后替换bash为blushell

nl /etc/passwd | sed -e 's/:/\t/;s/:/\t/'|less -S

用分号串联,替换了两次, 要想全部替换,+g,见上

nl /etc/passwd | sed 's/false$/&! ! !/' | less -S

在行末找到false后,在后面加三个叹号,&表示match的对象,也可以写成&&!!!,这样就又加了一个false

a:新增,a 接字串,而这些字串会在新的一行出现(目前的下一行)~

nl /etc/passwd | sed '1a\llll llllllll \n lllllll'|less -S

在第1行下面新增一行(a),单引号''里面是新增的内容,\n表示换行

i:相应的,i表示向上新增一行插入。

nl /etc/passwd | sed '2i drink tea' | cat -n

d :删除, d 后面通常不接任何内容

nl /etc/passwd | sed '3,$d'

删除第3到最后一行

c :取代, c接字串,这些字串可以取代 n1,n2 之间的行!

nl /etc/passwd | sed '2,5c No 2-5 number'

将第2-5行替换成"No 2-5 number"字符串。变化一下:sed '2,$c No End'

打印符合条件的/包含模版的行

-n :输出包含模版的行

p :打印,通常 p 会与参数 sed -n 一起运行~

nl /etc/passwd | sed -n '5,7p'    # 输出5-7行

nl /etc/passwd | sed -n '2p;4,5p' #输出第2行和4-5行

nl /etc/passwd |sed -n '4,+5p' # 输出第4行,以及往下5行

nl /etc/passwd | sed -n '4~4p' # 输出第4行,以及每隔4行输出

nl /etc/passwd | sed -n '/root/p'   # 只打印包含模式“root”的行,替换成别的字符串也行,类似于查找了

小结

  • sed命令的标准句式是sed [option] 's///g' tmp.txt,也可以借由管道符使文件(tmp.txt)是从前面传递而来的。
  • 其中参数放在[option]处,比如-e多次使用,-n打印特定行(和动作命令p配合使用)
  • a,c,d,i,e,s,g这些都是动作命令,放在单引号''内
  • $表示末行或行末;&表示匹配的对象,不要搞混了
  • 处理区域的选择规则写在's///g'的"s"前面。
    • 可以是数字,"1,5"表示1-5行,与R语言区别;
    • 可以是/pattern1/,选择含有pattern2的行;
    • 还可以是/pattern1/,/pattern2/,表示选择以pattern1起始,到pattern2结束的区域。

grep

个人理解:文本搜索,抓取

崔老师的讲解:https://www.jianshu.com/p/22a4324ddfdf

即(global regular expression print);Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行/特定内容打印出来。

匹配特征:grep默认一些简单正则,如^,$等,

参数多;常用的也多

直接就输出了,还会把匹配的部分用颜色高亮

nl /etc/passwd | grep 'qmcui'

提取含有'qmcui'的行

-v 参数

-v –invert-match:取没有匹配的行,反向选择

nl /etc/passwd | grep -v 'qmcui'

反向选择没有'qmcui'的行

-w 参数

-w –word-regexp:只选择匹配上整个 words,完全匹配

nl /etc/passwd | grep -w  "root"

这个不明显,比较一下下面这两个

nl /etc/passwd | grep  "100"
nl /etc/passwd | grep -w  "100"

[图片上传失败...(image-83f862-1555911189748)]

-i 参数

-i,–ignore-case:忽略Pattern 和文件内容的大小写

nl /etc/passwd | grep -i VIP

-e 参数

-e:多个-e 可以用来描述多个不同的匹配模式 ;or

sed命令里面的-e一样

nl /etc/passwd | grep -ie 'Server' -e 'root' -e 'qmcui'

一下两个是等同的,正则表达式

nl /etc/passwd | grep -e 'root' -e 'qmcui'
nl /etc/passwd | grep 'root\|qmcui'

-o 参数

-o:-n形式输出匹配内容,只输出匹配的内容

一般直接用似乎没有什么用,但是后面跟着wc可以计算匹配的数目或者行数,或者用-io模糊查找,返回输出正确的格式等等

-A / -B / -C 参数

邻居参数,输出匹配行的前后邻居们

-A :输出匹配行之的num行

-B :输出匹配行之的num行

-C :输出匹配行前后各num行

注意C的大小写!!!

-c 参数

-c 输出计数后的几行

自带计数参数

nl /etc/passwd | grep  -c  'qmcui'
nl /etc/passwd | grep -ie 'Server' -e 'root\|qmcui' -c

-n 参数

-n –line-number 显示行号

nl /etc/passwd | grep -n 'qmcui' # 这样用好没意义啊,nl本身就加了行号

-f 参数

-f FILE ,–file=FILE 从FILE中获得匹配的数据

# $ cat  match.txt      # cat >match.txt
# root
# qmcui
less /etc/passwd | grep -f match.txt

把文件match.txt中的内容进行匹配。

awk

个人理解:在文本里面抓取元素,然后进行运算。

崔老师的讲解:https://www.jianshu.com/p/b6aec932adcf

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

另一个写的不错的博客

https://indexofire.gitbooks.io/notebook_of_analyzing_pathogen_ngs_data/content/appendix/awk.html

基本句式

awk [option] '{pattern + action}' {inputfilenames} # sometims muti file is ok
awk [option] 'BEGIN{初始代码} {循环代码} END{最后代码}' filename

也可以理解为'BEGIN{运行前} {运行中} END{运行后}'。

另一篇博客把句式写为awk 'pattern { action }' input_file,他认为BEGIN也是一种pattern

awk 程序内容很简单,主要包括 pattern,action和输入文件:

  • pattern 表示所要搜索的内容,可以用正则表达式
  • { action } 则表示搜索匹配后要做的操作。
  • 输入文件:所要搜索的输入内容

awk 可以不需要输入文件;对于pattern和action来说,2者至少要有一个才能运行。如果没有pattern,则默认匹配任何输入,按行输出并执行action。如果没有action,则匹配pattern并按行输出不做额外操作。

最简单的语句,最好理解awk的功能。输入1 2 3,用$来索引使用

echo 1 2 3 |awk '{ print "total pay for", $1, "is", $2 * $3 }'
# total pay for 1 is 6

-F参数: 指定分隔符

以':'分割,输出第一个元素。

echo $PATH | awk -F ':' '{print $1}'

awk -F '[;:]' 指定多个分隔符。

体会BEGIN和END

以下两命令都是截取第1和第7个元素输出,第二句在输出内容前面加一行"name,shell",后面加一行"blue,/bin/nosh"。

cat /etc/passwd |awk  -F ':'  '{print $1","$7}'
cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'

统计计数

对内容"/etc/passwd"计数并输出结果($0输出输入的内容).

awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd

对内容"/etc/passwd"进行":"分割,开始时定义count=0,定义action:输出改行第一元素,然后计数+1。利用循环来输出。

NR表示行号。

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd

生信分析应用场景

这一讲内容很多,命令的变化很多,更加复杂了。简单理解一下在做生信分析时的应用场景(举个):

对列的操作:提取、排序、插入

生成的bam文件提取后续分析需要的列,并调整排序:

awk -F '\t' '{print $1,$7,$8,$9,$10}' OFS='\t' Cr_DJ-osdrm2_fCount.out > WT_osdrm2_matrix.out

awk '{ print $3, $5, $7, $2, $1, $4, $6 }' infile.txt > outfile.txt

# insert
awk '{ print $1, $2 "gene expression", $3}' infile.txt > outfile.txt

去除重复行

awk '!x[$0]++' infile.txt > outfile.txt

根据阈值挑选差异基因

awk '{if(($10<-2)&&($11<0.001))print $3"\t"$8"\t"$9"\t"$10}' gene_exp.diff | grep -v 'inf' > down.txt  
## 筛选出下调的基因(log2_fold_change < -2 & pvalue < 0.001)

awk '{if(($10>2)&&($11<0.001))print $3"\t"$8"\t"$9"\t"$10}' gene_exp.diff | grep -v 'inf' > up.txt 
## 筛选出上调的基因(log2_fold_change > 2 & pvalue < 0.001

你可能感兴趣的:([生信技能树线下]Linux课堂回顾)