Linux部分一直是我心頭的大山,感覺很難翻過去了,那么學習愚公,一勺一勺的慢慢挖吧。
先從復習和回顧課堂上的內(nèi)容開始。
文件目錄命令
- mkdir 創(chuàng)建文件夾/目錄
- -p 建立多層目錄
mkdir -p test1/test2/test3
- -p 建立多層目錄
- 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 > newfilecat 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
- -d 定義分隔符,默認為
- 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