122Linux系統和Shell指令行簡介,走上資料分析之路
本節作者:劉永鑫 中國科學院遺傳與發育生物學研究所
版本1.0.2,更新日期:2020年8月31日
本項目永久位址:https://github.com/YongxinLiu/MicrobiomeStatPlot ,本節目錄 122Linux,包含R markdown(*.Rmd)、Word(*.docx)文檔、測試資料和結果圖表,歡迎廣大同行幫忙稽核校對、并提出修改意見。送出回報的三種方式:1. 公衆号文章下方留言;2. 下載下傳Word文檔使用審閱模式修改和批注後,發送至微信(meta-genomics)或郵件([email protected]);3. 在Github中的Rmd文檔直接修改并送出Issue。審稿人請在創作者登記表 https://www.kdocs.cn/l/c7CGfv9Xc 中記錄個人資訊、時間和貢獻,以免專著發表時遺漏。
本文将帶大家熟悉Linux系統的指令行工作模式、軟體使用方式和目錄結構。帶大家熟悉傳說中駭客帝國般的代碼模式,走上資料分析之路!
開始本節學習前,Windows使用者需要完成上一節中的Git+R+RStudio的安裝:
- 121.個人電腦搭建微生物組分析平台(Win/Mac)
Mac和Linux使用者自帶Shell指令行環境,可直接安裝R+RStudio即可使用。不同作業系統環境下指令可能會略有不同。本文基于Windows的Git bash環境下測試。測試資料、腳本檔案(shell.sh)位于本節目錄中,可從github下載下傳。

Linux系統簡介
Linux是什麼?
- Linux是一種作業系統
- 支援多使用者、多任務操作
- 與Unix類似 (MacOS基于Unix開發)
目前主流的Linux發行版有Ubuntu、CentOS、RHEL(Redhat)和Android等。
Linux在哪兒應用?
- 網站伺服器、資料庫
- 計算伺服器及雲平台
- 桌上型電腦/筆記本等個人電腦
- 路由器
- 智能手機Android系統
為什麼學習Linux?
- 系統開源免費——節約成本且更安全
- 90%以上伺服器使用Linux系統
- 長期運作的穩定性
- 多數生物學軟體隻有Linux版本
- 強大的Bash指令簡化繁瑣的操作,尤其是大大簡化重複性工作
Shell指令行運作環境
指令行界面(Command-Line Interface, CLI)是在圖形使用者界面得到普及之前使用最為廣泛的使用者界面,它通常不支援滑鼠,使用者通過鍵盤輸入指令,計算機接收到指令後,予以執行。
通常認為,指令行界面(CLI)沒有圖形使用者界面(GUI)那麼友善使用者操作。由于指令行界面的軟體通常需要使用者輸入具體的操作指令,但指令行界面較圖形使用者界面更節約計算機系統的資源。并且在熟記指令的前提下,使用指令行界面往往要較使用圖形使用者界面的操作速度提高數倍,可自動全程可重複。是以,目前擁有圖形使用者界面的主流作業系統中,都保留着可選的指令行界面。
Linux和Mac系統自帶的Terminal程式可直接使用 Shell指令行。Windows自帶的Command Prompt和Windows PowerShell兩種指令行均為非主流,暫時還不友善開展生信分析。
這裡我們主要介紹三種适合在Windows下學習使用調用Linux Shell指令行界面的方法:
一、GitForWindows下模拟Shell指令行
圖. Git Bash使用者界面
在上一節我們介紹了如何安裝Git For Windows,它為系統提供了Git Bash的指令行環境,但本質上仍然是Windows系統,隻是把常用的Linux指令編寫成了Windows版本。具體使用同Linux基本一緻,可以開展有windows版本的指令及軟體分析,如usearch和vsearch等擴增子分析。但無法安裝僅限Linux版本的軟體。
指令行可以通過程式中的Git Bash打開。也可通過滑鼠右鍵菜單中的Git Bash Here快速打開,并切換至目前檔案夾。同時也支援在RStudio中的Termial中選擇Git bash并調用。
二、Windows子系統中的Linux Ubuntu 20.04 LTS
圖. Windows下Linux子系統:Ubuntu 20.04 LTS程式的使用者界面
目前Windows 10(確定Win10系統版本>1606,建議為最新版)可以直接在應用商店中安裝Linux子系統,并作為應用直接使用,無須挂載虛拟機。本質上相當于輕量級的虛拟機,可以安裝衆多Linux版本的軟體,而且輕松通路原系統中的檔案。
詳細教程見:
- Windows10安裝Linux子系統Ubuntu 20.04LTS,輕松使用生信軟體,效率秒殺虛拟機
有些同學可能還使用VirtualBox、VMWare等虛拟機安裝Linux系統進行學習,這裡不推薦使用,因為不僅系統資源占用率較大,而且運作效率也較上述Windows子系統低,體驗極差。同樣也不建議安裝雙系統Windows/Linux,在純Linux下很多常用軟體無法運作,學習辦公極不友善。
三、遠端通路Linux伺服器
圖. 使用XShell遠端通路Linux伺服器
個人電腦的性能仍然有限,通常具有2-8個計算核心,8-16GB記憶體。通常處理10GB以下資料尚能接受,如擴增子分析中幾十個樣本測序結果。但在面對宏基因組多達幾百、幾千GB資料時顯然無能為力。此時需要性能高達上百個計算核心,同時擁有TB級别記憶體的高性能計算伺服器,而在高性能計算叢集中也稱為胖結點(配置高的計算結點)。在Windows中,我們通常采用Xshell遠端連接配接伺服器并開展資料分析。
計算平台的選擇
工作站:包括日常使用的高配置桌上型電腦和筆記本,價格5 K – 30 K,可實作1 – 10 GB規模的資料分析;
伺服器:搭載專業主機闆,可以安裝CPU ✕ 1~4 + 記憶體 ✕ 48 + 磁盤陣列 (8T ✕ 12),價格30 K – 1 M,适合處理 10 GB – 10 TB規模資料。
計算機叢集:這裡主要指高性能計算叢集。叢集中成員根據配置特點分為管理結點、登陸結點、計算結點和胖結點,擴增子分析樣本數量較少可使用計算結點,而宏基因組拼接通常記憶體占用較大,多使用胖結點。
-
擴增子分析工作站:
預算10 - 50 K起
CPU: Intel i7,i9 / AMD R5, R7, R9 6 ~ 32核
記憶體:32 ~ 128 GB
磁盤:1~3 ✕ 8 TB(1 TB = 1024 GB)
OS:可選Ubuntu 18.04/20.04 LTS
-
宏基因組分析伺服器:
預算 30~700 K
CPU: Intel(R) Xeon(R) 10 ~ 28核 X 4顆 (最多112核,224線程)
記憶體:512GB ~ 2T(1 TB = 1024 GB)
磁盤陣列:48 ~ 96 TB X 2
OS:可選Ubuntu 18.04 / CentOS
Linux下Shell運作環境
Linux/Mac/Windows Shell比較
Linux是作業系統的類型,而Shell是一種程式和語言,是在Linux下與系統核心(kernel)溝通的一種環境。我們接下來的分析工作,主要依賴Shell環境來實作多種資料分析和可視化,也友善調用各種第三方程式。
Mac OS作業系統是基于Unix系統開發的作業系統,其系統下的Shell環境與主流Linux Shell操作基本一緻,而存在細微差異我們将會列出。因為擁有原生的Shell,這也是很多同行喜歡使用Mac電腦的原因之一。但Mac OS系統畢竟小衆,可供選擇的軟體數量相較Windows系統明顯減少,而且目前也存在穩定性和相容性不足的問題,是以不推薦生信新人上手(除非你特别喜歡Mac或折騰,若出現問題就自求多福吧!)。
Windows作業系統也具有Power Shell環境,但指令不夠強大,支援軟體較少,在生物資訊領域并非主流,本領域很少有人使用。但Windows系統中可用軟體最齊全,穩定性極高,也可以選擇安裝Linux子系統或者挂載虛拟機,操作較簡單,有多種方式實作Linux Shell,如前文提及Git bash,Ubuntu等方法。
Linux目錄結構
Linux下所有目錄都在根目錄下,用 / 表示。下面有幾個固定的子檔案夾,如/bin, /tmp, /usr, /home, /etc等。是以在通路目錄時一般加上 / 訓示相對于絕對路徑。
登入系統後進入家目錄(~ 或 如/home/yongxin)
-
/:
根目錄,所有的目錄、檔案、裝置都在/之下,/就是Linux檔案系統的組織者,也是最上級的上司者。
-
/bin:
bin 就是二進制(binary)英文縮寫。
在一般的系統當中,都可以在這個目錄下找到linux常用的指令。
系統所需要的那些指令位于此目錄或/usr/bin、/usr/local/bin中。
-
/etc:
etc (Editable Text Configuration) 目錄是linux系統中最重要的目錄之一。
此目錄下存放了系統管理所需的各種配置檔案和子目錄。
例如網絡配置檔案,檔案系統,系統配置檔案,裝置配置資訊,設定使用者資訊等都在該目錄下。
-
/home:
如果建立一個使用者,使用者名是“xx”,預設在/home目錄下就有一個對應的/home/xx路徑,用來存放使用者的主目錄。
當然也可指定新使用者家目錄于其它位置。
-
/mnt:
這個目錄一般是用于存放挂載儲存裝置的挂載目錄,比如磁盤陣列、U盤和移動硬碟、Windows下的c/d盤等目錄。
-
/lib:
lib是庫(library)英文縮寫。
這個目錄用于存放系統動态連結共享庫。
幾乎所有的應用程式都會用到這個目錄下的共享庫。
是以,千萬不要輕易對這個目錄進行什麼操作,一旦發生問題,系統就無法正常工作。
Win10 + Rstudio + gitforwindows運作Linux的Shell指令
圖. 在Windows系統下RStudio調用Git bash環境運作常用Linux指令
在這裡所有的目錄結構仍然與系統保持一緻。如C槽為
/c
目錄。可以輕松使用Linux常見問題,接下來我們的擴增子分析的流程也将在此環境下完成。
下面的教程也基于此模式示範。另外需要注意的是:Windows下linux子系統的安裝,必須是Windows 10最新版才能實作;而利用XShell遠端登陸Linux伺服器則為更專業的Linux操作環境。這些模式的操作方式基本相同,是以其他環境下的朋友也可參考下面的教程繼續學習。
Linux Shell常用指令
在Linux下,我們都是通過Shell”指令”進行操作的。
指令 = 執行某一個或某一組程式
執行指令,需要在”指令行”輸入輸令,并按回車執行。常見格式如下:
說明:
- 指令行永遠以可執行程式開始;
- [-選項] 的方括号表示該項目是可選的,不是每次都必須要輸入;
- 不同的項之間以空格分隔,指令行以回車結束并即刻執行;
- Linux是區分大小寫的,即cd和CD代表不同的意義。
目錄操作pwd/mkdir/cd
- 我在哪pwd
Windows圖形界面下,我們的出發點通常是桌面、我的檔案、C槽、D盤等目錄。
在Shell指令行環境下,新人第一次使用會感覺手足無措,首先是我在哪裡?
此時我們學習第一個指令來回答你的問題:隻有3個字母,pwd
pwd # 顯示目前工作目錄 (print working directory)
pwd為指令,井号(#)後内容為注釋内容,友善讀者了解
在Termial中輸入pwd并按回車,會顯示Terminal終端的目前位置,一般預設為家目錄,即/home/yourname,可以縮寫為~。
下面是一個在Rmd中插入的Shell代碼塊,可在RStuido中逐行(Ctril+Enter)或逐塊運作(點選Run Current Chunk),運作會顯示目前Rmd文檔所在位置,因Rmd文檔或R項目會自動切換為文檔所在目錄。也可複制代碼到下方Terimial中粘貼,然後按回車運作,則顯示終端的目前位置。
pwd
上面運作了pwd指令,顯示我目前工作所在的目錄。/mnt/d是系統D盤,後面是層級目錄,主要有3級,比如我這節122Linux入門教程(122Linux),就儲存于1級home,我個人習慣把電腦的所有檔案均存于此,友善備用和遷移;2級是github,我們所代碼相關的項目儲存于此,與github同步,可提供版本管理、釋出和備用的作用,所有内容可線上 https://github.com/yongxinliu 檢視;3級是MicrobiomeStatPlot是本系列教程《微生物組資料分析與可視化實戰》專著的項目目錄。
注意:在你電腦上運作此指令或顯示你所在的目錄,與我的結果會有不同。
- 建立檔案夾mkdir
比如我們要開始一個新的分析項目,最好建立一個檔案夾友善集中存放相關檔案。
比如現在Windows下的C槽中建立test目錄,在Terimial中運作如下指令:
mkdir -p /c/test
mkdir是make directory的縮寫,即建立檔案夾;-p是參數,它允許我們建立多級目錄,如/c/test/a1/today,同時檔案夾存在也不會報錯中止分析;後面是檔案夾的絕對位置,也可以是相對于目前所在位置的相對位置。
我們再執行一次不帶-p參數的指令:
mkdir /c/test
會顯示:不能建立目錄,目标檔案已存在(mkdir: cannot create directory ‘/c/test’: File exists)。你可以自己嘗試執行帶-p參數的指令試試效果。
- 切換工作目錄cd
Windows下進入目錄需要層層輕按兩下,像爬樓梯一樣。在Shell下我們使用cd可以快速跳轉至任意目錄,相當于電梯直達。
cd:切換工作目錄 (change dir),預設為家目錄
我們在c盤下建立qiime2目錄,并進入,然後确定目前目錄
mkdir -p /c/qiime2
cd /c/qiime2
pwd
我們看到建立檔案夾成功,并确定切換至/c/qiime2。
值得注意的是,在分析某一項目時,盡量保持在該項目目錄下工作,可以更有效使用相對路徑讀取和寫入檔案,簡化代碼。
檔案操作ls/cp/mv/rm
視窗模式下進入檔案夾會自動顯示内容。Linux Shell下需要輸入ls(list)指令顯示該目錄下所有檔案:
ls
我們通常要詳檢視個檔案,或檔案夾的資訊,可以在最後面指定名稱;如果顯示常用檔案詳細資訊,加-l參數(list)
ls -l example.fq.gz
檔案大小是位元組為機關,可以添加-h(human readable)更改為可讀的K/M/G的機關
ls -lh example.fq.gz
- cp # 拷貝檔案,複制原檔案至目标位置 (copy)
複制test.sh檔案為file_temp.txt檔案
# 複制檔案
cp test.sh file_temp.txt
# 檢視結果
ls -lh file_temp.txt
複制test.sh至test目錄
# touch建立一個空檔案,或更新檔案修改時間
touch test.sh
# 建立test目錄
mkdir -p test
# 複制檔案到指定目錄
cp test.sh test/
# 顯示檔案夾檔案可讀(h, human readable)大小(s, size)
ls -hs test/
- mv # 移動或重命名檔案 (move)
mv可以不同檔案夾下移動檔案或檔案夾
相同檔案下移動即為改名
# 移動檔案至test目錄
mv file_temp.txt test/
# 改名
mv test/file_temp.txt test/test.sh
- rm # 删除檔案 (remove)
rm test/test.sh # 删除檔案
rm -r test # 删除檔案夾
Tab鍵自動補全
Tab鍵可用于補全:指令、檔案名,是以隻需記住一部分名稱即可自動補全。
補全的原則:
- 如果唯一,則按一次Tab直接補全;
- 如果有多個選擇,按一下補至最大唯一項,則按兩次Tab列出全部的可能選項。
如目錄存在t開頭唯一檔案test.sh
cat t 并按tab鍵
即可顯示如下:
cat sh
另一種多選情況如下:面對多個選擇時,按一下補至最大唯一,再按兩次Tab顯示所有可能選項
ls 122
# 按tab鍵,會自動被全為
ls 122Linux簡介和Shell環境.
# 按兩下tab顯示候選
122Linux簡介和Shell環境.Rmd 122Linux簡介和Shell環境.docx
程式中止指令Ctrl+C
Ctrl + C
功能:用于終止目前運作中的指令
用法:在程式運作中,先按住Ctrl鍵不放,然後再按C鍵,釋放
例如:執行ping -t www.baidu.com
按Ctrl + C終止ping的循環,退回到Linux指令提示符
注:Linux系統下Ctrl+C是程式中止,而在Windows下是複制指令,很容易誤操作導緻程式中斷,建議運作較長時間的指令,可以在結果添加 & 符轉背景以防誤操作中斷。還有Windows下的許多翻譯軟體或自動複制文字,其不斷地發出Ctrl+C的信号,打斷指令的輸入和執行,是以不建議在使用Shell同時運作此類軟體。
編寫一個Shell腳本/程式
剛才提到到,Shell既是一種工作環境,也是一門語言,可以寫成.sh格式的腳本或程式,批量或成多步操作。
使用cat指令建立一個sh檔案
- cat # 檢視檔案 (concatenate files and print)
# 建立檔案,并開始寫入
cat > test.sh
# 我們輸入如下内容,按Ctrl+D結束輸入
#! /bin/bash
echo "Hello metagenome!"
“#!”行代表指定代碼的解析器,shell腳本通常指定/bin/bash解析 ,echo是輸出指令,将輸入内容輸出到螢幕上。
腳本寫好後,可以用bash指令解析執行。如果想直接當作程式運作,還需要添加可執行權限。注:Windows中擴充名為.exe/com/bat類檔案可執行,而Linux Shell環境中任何檔案能否執行,由是否具有可執行權限決定。
- • chmod +x # 添加檔案可執行權限(change file mode bits)
除了[x]外,還有[r,w,x] ;[r],[w],[x]分别代表可讀(read)、可寫(write)、可執行(execute)
chmod +x test.sh
運作程式,執行結果為Hello metagenome!
./test.sh
認識和操作Fastq檔案
Illumina測序資料通常是Fastq格式。如果是雙端測序,會有兩個檔案:_1.fq.gz和_2.fq.gz。
每4行表示一條reads
-
第一行:
@序列ID,包含index序列及read1或read2标志:
-
第二行:
堿基序列,大寫”ACGTN”;
-
第三行:
”+”,預留行,有時候是序列ID;
-
第四行:
品質值序列:
字元的ASCII碼值-33=品質值
我們提供了一個fastq檔案,example.fq.gz。
gz結尾的格式為壓縮檔案,使用gunzip指令解壓檔案 (g-un-zip)
gunzip -c example.fq.gz > example.fq
head/tail顯示檔案頭尾,預設10行。-n指定行數,-n與行數間空格可省略。
head -n 4 example.fq
tail -n4 example.fq
如果我們想按頁檢視檔案,可使用less指令,-S不換行,空格翻頁,q退出
less -S example.fq
轉換fastq為fasta,并按順序重命名序列
awk 'NR%4==2 {print ">E"NR/4+0.5"\n"$0}' example.fq > example.fa
顯示fasta檔案末尾4行
tail -n4 example.fa
grep指令查找某條序列,統計fasta檔案序列條數。結果較多,使用 | 重定向,并使用head指令隻顯示前3行
grep 'AAAACACAGGAACCTGGGTGAAAAC' example.fa | head -n3
grep -c統計序列條數,每個fasta格式序列有一個>,統計帶有>行數。也可以直接統計>的個數。
grep -c '>' example.fa
計算fasta檔案每條序列長度。-v為排除’>’行僅剩序列,再連用awk的length統計序列長度,并用print輸出結果。結果多,僅用head輸出前3行結果預覽
grep -v '>' example.fa | awk '{print length($0)}' | head -n3
統計序列長度分布。在上面基礎上按長度數值(-n, number)排序(sort),并去備援(uniq指令為unique縮寫)統計每種長度的數量(-c)即為長度分布。如想調整排序為由大到小,修改sort -n為sort -nr,r為按反向(reverse)排序。
grep -v '>' example.fa | awk '{print length($0)}' | sort -n | uniq -c
-
gzip指令壓縮fastq檔案
gzip example.fq
中繼資料/換行符操作
- cat -A預覽并檢查是metadata.txt是否存在windows/mac換行符
cat -A metadata_win.txt|head -n3
結果中”^I”代表制表符,”$“代表Linux系統标準換行符,而”^M$”為Windows換行符。
我們在分析時,有一半的錯誤是由于Windows/Mac/Linux三大系統中的換行符不一緻導緻的。是以分析前,需要把Windows/Mac格式的換行符轉換為Linux格式。而Linux格式換行符在Windows/Mac中也可正常使用,無須反向轉換。
表. 三大系統下換行符及正規表達式
系統 | 符号 | 正規表達式 |
---|---|---|
Windows | ^M$ | \r\n |
Mac | ^M | \r |
Linux | $ | \n |
- Windows換行符轉換為Linux格式
# 預覽win格式
cat -A metadata_win.txt|head -n2
# 删除^M即轉換為Linux
sed 's/\r//' metadata_win.txt > metadata.txt
# 預覽linux格式
cat -A metadata.txt|head -n2
注意:我們分析前後用cat -A預覽平時不可見的符号。相當于對分析任務的檢查,雖然并沒有輸出結果,在分析中保證結果符合預期是非常必要的檢查點(check points)。
- Mac換行符轉換為Linux格式
# 預覽mac格式,windows下會顯示為1行,cut提取前60個字元
cat -A metadata_mac.txt | cut -c 1-60
# 删除^M即轉換為Linux,g為單行多次替換
sed 's/\r/\n/g' metadata_mac.txt > metadata.txt
# 預覽linux格式
cat -A metadata.txt|head -n3
此外,我們還可以使用文本編輯器轉換。如Notepad++,在編輯——文檔格式轉換菜單,可以切換Windows/Macintosh(Mac)/Unix(Linux)三種主流系統的換行符。
- cut列操作
第一列是樣本名,我們采用cut提取第一列(-f, field)。後面接head隻預覽前3行
cut -f 1 metadata.txt | head -n3
循環和變量批量操作
- 模拟生成18個測序檔案,位于seq目錄
#建立seq目錄
mkdir -p seq
# 循環成生1-18個檔案
for i in `seq 1 18`;do
touch seq/${i}.fq.gz
done
seq 1 18指令生成數列,并逐個傳遞給變量i。然後使用touch指令在seq目錄下建立名為*.fq.gz的模拟資料壓縮格式檔案。
- 按照metadata樣本名批量修改樣本名
我們的樣本名稱是1,2,…18完全沒有辨識度,而且非字母開頭也容易出問題。我們把這些名稱按實驗設計改為KO1,KO2..,WT6等簡潔标記,具有分組和樣本重複的合理名稱。具體編寫請參考metadata.txt。然後使用如下指令批量改名,如把第3列改為第1列。要求每列的名稱必須唯一,絕不允許出現重名。
# 預覽中繼資料
head -n3 metadata.txt
# 将3列ID改為1列樣本ID
awk 'BEGIN{OFS=FS="\t"}{system("mv seq/"$3".fq.gz seq/"$1".fq.gz")}'
我們使用awk逐行讀取metadata.txt,并使用system函數調用mv指令對檔案進行改名。BEGIN{OFS=FS=”\t”}設定讀取檔案分隔符為制表符,tail -n+2 metadata.txt代表從第2行讀取跳過标題行。
sed替換文字内容
假如metadata中的Beijing寫錯了,需要替換為Nanjing
sed 's/Beijing/Nanjing/' metadata.txt|head -n3
- s: substitute
- /: 分隔符,可以是任意字元,前後統一就行
- s/original/new/: 原始的替換為新的
- sed ‘s/Beijing/Nanjing/‘ metadata.txt對中繼資料中的Beijing全部替換為Nanjing,并輸出到螢幕,可用>寫入新檔案
awk統計和列操作表格
- 提取兩列并交換順序
取出metadata.txt的前兩列,并把第二列作為輸出結果的第一列
awk 'BEGIN{OFS=FS="\t"}{print $2,$1}' metadata.txt|head -n3
- awk語言的基本文法說明
- awk擅長于對檔案按行操作,每次讀取一行,然後進行相應的操作。
- awk讀取單個檔案時的基本文法格式是awk ‘BEGIN{OFS=FS=”\t”}{print $0, $1;}’ filename。
- 讀取多個檔案時的文法是awk ‘BEGIN{OFS=FS=”\t”}ARGIND==1{print $0, $1;}ARGIND==2{}’ file1 file2。
- awk後面的指令部分是用引号括起來的,可以單引号,可以雙引号,但注意不能與内部指令中用到的引号相同,否則會導緻最相鄰的引号視為一組,引發解釋錯誤。
- OFS: 檔案輸出時的列分隔符 (output field separator)
- FS: 檔案輸入時的列分隔符 (field separator)
- BEGIN: 設定初始參數,初始化變量
- END: 讀完檔案後做最終的處理
-
其它{}:
循環讀取檔案的每一行,大括号内的指令對每一行都有效,除非有額外判斷
-
$0表示一行内容;
$1, $2, … $NF表示第一列,第二列到最後一列。
- NF (number of fields)檔案多少列;
- NR (number of rows) 所有檔案目前讀取了多少行
- FNR 目前檔案讀取了多少行,常用于多檔案操作時
- a[$1]=1: 索引操作,類似于python中的字典,在ID map、注釋和統計中有很多應用
-
計算每個樣品的生物重複個數
awk ‘BEGIN{OFS=FS=”\t”}{a[$2]+=1}END{for(i in a) print i,a[i];}’ metadata.txt
A 6
B 6
C 6
group 1
結果多了一行,if(FNR>1)略過标題行
awk 'BEGIN{OFS=FS="\t"}{if(FNR>1) a[$2]+=1}END{for(i in a) print i,a[i];}' metadata.txt
A 6
B 6
C 6
- awk中常用幾個符号
-
=:
一個等号表示指派
-
==:
表示判斷兩側的變量是否相等,如FNR==1,若相等傳回True
-
!=:
表示判斷兩側的變量是否不相等,若不等,傳回True
-
>,
判斷數值或字元串的大小
-
+=:
自加操作 a+=1 等同于 a = a+1
-
%:
取餘數
-
+, -, * , / :
加減乘除
-
&&, ||, !:
邏輯與,邏輯或,邏輯非
- awk中的括号和引号
-
():
一般用于函數中,傳遞參數
-
[]:
一般用于索引清單或字典,取出清單中第幾位元素,或字典中某個key對應的value
-
{}:
代碼塊,多行語句放在一起,屬于一個層級
-
“”, ‘’:
雙引号和單引号括起的是字元串,bash中雙引号中的變量可以解析,單引号不可以。
同樣的引号不可以嵌套,如 awk “{print “ehbio”}”是不對的,要寫成awk ‘{print “ehbio”}’或awk “{print ‘ehbio’}”。
-
;:
分号用于分割語句塊
Linux Shell程式中的常用符号和指令
- 常用符号
-
\t:
代表TAB鍵
-
*:
代表任意字元
-
|:
管道符,傳遞資料,上一條指令的輸出作為下一條指令的輸入
-
>:
輸出重定向,常用語把輸出結果寫入檔案
表. Linux Shell常用指令總結
pwd | 顯示目前目錄 | cat | 檢視檔案 | head | 篩選檔案開頭N行 |
---|---|---|---|---|---|
ls | 列出目錄内容 | ping | 測試網絡連接配接 | tail | 篩選檔案結尾N行 |
ls -l | 詳細列出目錄内容 | less -S | 上下翻頁檢視檔案 | grep | 篩選特定關鍵詞的行 |
cd | 切換目前目錄 | cp | 複制檔案 | cut | 列操作 |
mkdir | 建立目錄 | mv | 移動檔案 | sed | 文本替換 |
chmod | 修改檔案權限 | rm | 删除檔案 | sort | 排序 |
gunzip | 解壓縮gz檔案 | awk | 文本處理工具 | uniq -c | 去備援并統計 |
\ | 管道,指令串聯 | Ctrl+D | 終止編輯 | Ctrl+C | 終止運作程式 |
圖. RStudio中Git bash環境下運作Shell腳本
圖. RStudio中Git bash環境下路徑變化
開始接觸指令行,一個難跨越的概念是檔案路徑。Linux系統雖然好用,但還沒智能到隻給檔案名就能判斷路徑的地步,實際也沒必要,而且會引發危險。在Windows下通路檔案時,會一層層打開檔案夾去檢視,Linux下也類似,隻不過用cd代替了打開操作。如果碰到檔案找不到的錯誤,一定先檢查目前所在目錄和檔案所在目錄。
任何新事物的學習和使用,都是一個逐漸學習和熟悉的過程,我們會不斷積累常用的指令,不熟悉的自然也會遺忘,逐漸形成自己的知識體系,在此基礎上解決科研問題,勇攀科研高峰!
參考文獻
- 生信寶典Linux系列教程
- 鳥哥的Linux私房菜基礎學習篇
- 宏基因組Linux相關教程
責編:劉永鑫 中科院遺傳發育所
版本更新曆史
1.0.0,2020/8/29,劉永鑫,初稿
1.0.1,2020/8/30,吳翔宇 甯波大學,全文校對
1.0.2,2020/8/31,劉永鑫,整合校對
猜你喜歡
10000+:菌群分析 寶寶與貓狗 梅毒狂想曲 提DNA發Nature Cell專刊 腸道指揮大腦
系列教程:微生物組入門 Biostar 微生物組 宏基因組
專業技能:學術圖表 高分文章 生信寶典 不可或缺的人
一文讀懂:宏基因組 寄生蟲益處 進化樹
必備技能:提問 搜尋 Endnote
文獻閱讀 熱心腸 SemanticScholar Geenmedical
擴增子分析:圖表解讀 分析流程 統計繪圖
16S功能預測 PICRUSt FAPROTAX Bugbase Tax4Fun
線上工具:16S預測培養基 生信繪圖
科研經驗:雲筆記 雲協作 公衆号
程式設計模闆: Shell R Perl
生物科普: 腸道細菌 人體上的生命 生命大躍進 細胞暗戰 人體奧秘
寫在後面
為鼓勵讀者交流、快速解決科研困難,我們建立了“宏基因組”專業讨論群,目前己有國内外5000+ 一線科研人員加入。參與讨論,獲得專業解答,歡迎分享此文至朋友圈,并掃碼加主編好友帶你入群,務必備注“姓名-機關-研究方向-職稱/年級”。PI請明示身份,另有海内外微生物相關PI群供大佬合作交流。技術問題尋求幫助,首先閱讀《如何優雅的提問》學習解決問題思路,仍未解決群内讨論,問題不私聊,幫助同行。
學習16S擴增子、宏基因組科研思路和分析實戰,關注“宏基因組”