[生信技能樹線下]Linux課堂回顧

Linux部分一直是我心頭的大山,感覺很難翻過去了,那么學習愚公,一勺一勺的慢慢挖吧。

先從復習和回顧課堂上的內(nèi)容開始。

文件目錄命令

  • mkdir 創(chuàng)建文件夾/目錄
    • -p 建立多層目錄 mkdir -p test1/test2/test3
  • cd 目錄切換
  • ls 目錄展示
  • tree 樹形展示
    • -d 只看目錄
    • -L num 顯示num層目錄
  • touch 創(chuàng)建文本 一般用它來判斷該目錄的寫入權限
    • touch new.txt
  • rm 刪除文件
    • rm -r 遞歸刪除,刪除目錄
    • rm -i 搞不清楚有沒有刪錯前可以加上 刪除前詢問
  • cp 復制/拷貝
    • cp -i 覆蓋前詢問
    • cp -r 復制目錄及其內(nèi)所有項目
    • 目標路徑必須提前建好,不帶有新建目錄的功能
  • less 查看大文本
    • -S 大寫 單行顯示,看表達矩陣是方便對齊
    • -N 大寫 加編號
    • less之后的操作不會改變原文本
  • vim 編輯文本
    • 進入編輯器后,我們先按i,即切換到“插入”狀態(tài)。就可以通過上下左右移動光標,或空格、退格及回車等進行編輯內(nè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 建立鏈接,相當于創(chuàng)建快捷方式
  • 查看幫助文檔 -- help (兩個-)

進階命令一

  • cut 文件切割,配合管道符內(nèi)容使用
    • -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“,而不是字符串a(chǎn)tcg去匹配
  • wc 計算文本大小,行數(shù),字符數(shù)

進階命令二

三大命令:sed, grep, awk

sed

個人理解:編輯文本,"替換",按條件打印包含模版的行

崔老師的講解:http://www.itdecent.cn/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"前面的內(nèi)容

由于輸出內(nèi)容很多,密密麻麻的,替換的地方可能察覺不到,建議眼花如我的都先不要sed,看看原始的長什么樣子,然后截屏比較命令的差別。

編輯文本,替換

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

把":"分割成"tab",只替換第一個。

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

nl 表示給列出的內(nèi)容加上行號

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

s和g分別表示開始和結束,所以這里表示從第4行到最后一行(4,$)執(zhí)行上述替換

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

-e:表示多次使用sed,這句里面執(zhí)行了兩個替換: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

用分號串聯(lián),替換了兩次, 要想全部替換,+g,見上

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

在行末找到false后,在后面加三個嘆號,&表示match的對象,也可以寫成&&?。。。@樣就又加了一個false

a:新增,a 接字串,而這些字串會在新的一行出現(xiàn)(目前的下一行)~

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

在第1行下面新增一行(a),單引號''里面是新增的內(nèi)容,\n表示換行

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

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

d :刪除, d 后面通常不接任何內(nèi)容

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 會與參數(shù) 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)是從前面?zhèn)鬟f而來的。
  • 其中參數(shù)放在[option]處,比如-e多次使用,-n打印特定行(和動作命令p配合使用)
  • a,c,d,i,e,s,g這些都是動作命令,放在單引號''內(nèi)
  • $表示末行或行末;&表示匹配的對象,不要搞混了
  • 處理區(qū)域的選擇規(guī)則寫在's///g'的"s"前面。
    • 可以是數(shù)字,"1,5"表示1-5行,與R語言區(qū)別;
    • 可以是/pattern1/,選擇含有pattern2的行;
    • 還可以是/pattern1/,/pattern2/,表示選擇以pattern1起始,到pattern2結束的區(qū)域。

grep

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

崔老師的講解:http://www.itdecent.cn/p/22a4324ddfdf

即(global regular expression print);Linux系統(tǒng)中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行/特定內(nèi)容打印出來。

匹配特征:grep默認一些簡單正則,如^,$等,

參數(shù)多;常用的也多

直接就輸出了,還會把匹配的部分用顏色高亮

nl /etc/passwd | grep 'qmcui'

提取含有'qmcui'的行

-v 參數(shù)

-v –invert-match:取沒有匹配的行,反向選擇

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

反向選擇沒有'qmcui'的行

-w 參數(shù)

-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 參數(shù)

-i,–ignore-case:忽略Pattern 和文件內(nèi)容的大小寫

nl /etc/passwd | grep -i VIP

-e 參數(shù)

-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 參數(shù)

-o:-n形式輸出匹配內(nèi)容,只輸出匹配的內(nèi)容

一般直接用似乎沒有什么用,但是后面跟著wc可以計算匹配的數(shù)目或者行數(shù),或者用-io模糊查找,返回輸出正確的格式等等

-A / -B / -C 參數(shù)

鄰居參數(shù),輸出匹配行的前后鄰居們

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

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

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

注意C的大小寫!!!

-c 參數(shù)

-c 輸出計數(shù)后的幾行

自帶計數(shù)參數(shù)

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

-n 參數(shù)

-n –line-number 顯示行號

nl /etc/passwd | grep -n 'qmcui' # 這樣用好沒意義啊,nl本身就加了行號

-f 參數(shù)

-f FILE ,–file=FILE 從FILE中獲得匹配的數(shù)據(jù)

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

把文件match.txt中的內(nèi)容進行匹配。

awk

個人理解:在文本里面抓取元素,然后進行運算。

崔老師的講解:http://www.itdecent.cn/p/b6aec932adcf

AWK是一種處理文本文件的語言,是一個強大的文本分析工具。之所以叫AWK是因為其取了三位創(chuàng)始人 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{初始代碼} {循環(huán)代碼} END{最后代碼}' filename

也可以理解為'BEGIN{運行前} {運行中} END{運行后}'。

另一篇博客把句式寫為awk 'pattern { action }' input_file,他認為BEGIN也是一種pattern

awk 程序內(nèi)容很簡單,主要包括 pattern,action和輸入文件:

  • pattern 表示所要搜索的內(nèi)容,可以用正則表達式
  • { action } 則表示搜索匹配后要做的操作。
  • 輸入文件:所要搜索的輸入內(nèi)容

awk 可以不需要輸入文件;對于pattern和action來說,2者至少要有一個才能運行。如果沒有pattern,則默認匹配任何輸入,按行輸出并執(zhí)行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參數(shù): 指定分隔符

以':'分割,輸出第一個元素。

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

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

體會BEGIN和END

以下兩命令都是截取第1和第7個元素輸出,第二句在輸出內(nèi)容前面加一行"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"}'

統(tǒng)計計數(shù)

對內(nèi)容"/etc/passwd"計數(shù)并輸出結果($0輸出輸入的內(nèi)容).

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

對內(nèi)容"/etc/passwd"進行":"分割,開始時定義count=0,定義action:輸出改行第一元素,然后計數(shù)+1。利用循環(huán)來輸出。

NR表示行號。

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

生信分析應用場景

這一講內(nèi)容很多,命令的變化很多,更加復雜了。簡單理解一下在做生信分析時的應用場景(舉個??):

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

生成的bam文件提取后續(xù)分析需要的列,并調(diào)整排序:

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

根據(jù)閾值挑選差異基因

awk '{if(($10<-2)&&($11<0.001))print $3"\t"$8"\t"$9"\t"$10}' gene_exp.diff | grep -v 'inf' > down.txt  
## 篩選出下調(diào)的基因(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 
## 篩選出上調(diào)的基因(log2_fold_change > 2 & pvalue < 0.001

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容