前面已經(jīng)介紹了比較基礎(chǔ)Linux命令,在這一部分我將介紹適合多樣本數(shù)據(jù)分析的一些常用的復(fù)雜命令。
以bulk轉(zhuǎn)錄組為例
接前面,我們使用mamba已經(jīng)成功安裝分析所需的各種包椿胯,現(xiàn)在需要使用它們一步步進行分析。一般我們測序的樣本至少包括六個(control組三次重復(fù)剃根,實驗組三次重復(fù)哩盲,還可能包括不同時間,處理方式等等)狈醉。每一個樣本生成的測序數(shù)據(jù)都需要運行轉(zhuǎn)錄組數(shù)據(jù)分析流程(包括質(zhì)控廉油,比對,定量等)苗傅。而顯然一個個樣本運行并不是明智的選擇抒线,效率低且容易出錯。這就需要學習編寫shell腳本渣慕、使用循環(huán)語句十兢、條件語句等
首先介紹shell及shell腳本。Shell是計算機操作系統(tǒng)中的命令行解釋器摇庙,用于解釋和執(zhí)行用戶輸入的命令旱物。它是用戶與操作系統(tǒng)內(nèi)核之間的接口,允許用戶通過命令行界面與操作系統(tǒng)進行交互卫袒。Bash是最常用的Shell宵呛,幾乎所有的Linux發(fā)行版都默認使用它。shell腳本就是由一系列命令組成的執(zhí)行文件夕凝,將一些命令整合到一個文件中宝穗,并以文本文件的形式保存,以便在Shell中執(zhí)行码秉。Shell腳本通常用于自動化重復(fù)性任務(wù)逮矛、批處理作業(yè)和系統(tǒng)管理。
腳本文件的命名:Shell腳本文件通常以.sh為擴展名转砖,例如RNA-seq.sh
指定解釋器:腳本文件的第一行通常是指定要使用的Shell解釋器须鼎,如#!/bin/bash
使用#符號添加注釋鲸伴,這些注釋將被解釋器忽略。注釋對于解釋腳本中的操作和目的非常有幫助晋控。下面是shell腳本的簡單編寫和運行
#編寫shell腳本汞窗,打開一個文本編輯器
vi RNA-seq.sh
#!/bin/bash
#This is a RNA-seq script
#Shell腳本支持設(shè)置變量,使用=符號賦值
name="john"
#echo命令將文本輸出到終端
echo "what is your name"
#使用變量赡译,用$引用變量仲吏,下面兩種都可以
echo $name
echo ${name}
#在${}中使用“#”獲取長度,返回4
echo ${#name}
#提取子字符串蝌焚,從第二個字符到第四個字符裹唆,以及從第一個字符到第四個字符輸出john
echo ${name:1:3}
echo ${name::3}
#運行.sh腳本
bash RNA-seq.sh
接下來在多個樣本處理過程中,需要重復(fù)運行各個命令只洒,這就用到了循環(huán)語句许帐。
我一般常用的就是for循環(huán)。for語句結(jié)構(gòu)是讀取不同的變量值红碑,用來逐個執(zhí)行同一組命令
for 變量名 in 取值列表
do
命令
done
#將路徑設(shè)置為變量舞吭,以后再分析相似類型的數(shù)據(jù)泡垃,腳本就不用每一步都修改路徑了析珊,只需要將path變量修改成適合的路徑即可
path=/home/RNA-seq
cd $path/fastq
for i in $path/fastq
do
echo $i
done
需要注意的是一般測序數(shù)據(jù)都是雙端測序數(shù)據(jù),即一個樣本有R1.fq.gz和R2.fq.gz兩個測序文件蔑穴,所以每個樣本在執(zhí)行命令時需要同時輸入兩個文件忠寻,而for循環(huán)每次只能讀取一個變量值。所以我們首先需要解決這個問題
#首先制作一個腳本
vi fastq.sh
#!/bin/bash
#列出所有(_R1.fq.gz)的路徑存和,并將這些路徑保存到文件1中奕剃。>符號被用作輸出重定向操作符,作用是將命令的輸出結(jié)果寫入到指定的文件中捐腿。
ls /home/RNA-seq/fastq/*_R1.fq.gz > 1
ls /home/RNA-seq/fastq/*_R2.fq.gz > 2
#使用cut命令根據(jù)/分隔符提取第5個字段(第一個字段為空纵朋,完整文件路徑在第5個位置),再次使用cut根據(jù)_分隔符提取第1個字段(樣本名)茄袖,并將結(jié)果保存到文件0中操软。
ls /home/RNA-seq/fastq/*_R2.fq.gz |cut -d"/" -f 5|cut -d"_" -f 1 > 0
#paste命令合并文件0、1和2的內(nèi)容(分別是樣本名宪祥、_R1.fq.gz和_R2.fq.gz的路徑)聂薪,生成文件config
paste 0 1 2 > config
#類似于sample1 /home/RNA-seq/fastq/sample1_R1.fq.gz /home/RNA-seq/fastq/sample1_R2.fq.gz
以數(shù)據(jù)質(zhì)控為例
#接前面的RNA-seq.sh
mkdir -p $path/1.QC
cd $path/1.QC
#$(cat config) 的作用是將config文件的內(nèi)容輸出,然后這個輸出會被用在for循環(huán)中蝗羊,依次賦值給循環(huán)變量i
#使用$引用變量藏澳,其中每一行(i) 代表一個元素。每個元素中的第1個字符為樣本名耀找,其索引為0(即[0])翔悠,依次為_R1.fq.gz([1])和_R2.fq.gz([2])
for i in $(cat config)
do
echo $i
arr=($i)
fq1=${arr[1]}
fq2=${arr[2]}
sample=${arr[0]}
fastqc fq1 fq2 -o $path/1.QC
done
常用的還有while循環(huán)語句。只要條件成立,則反復(fù)循環(huán)凉驻,不成立即停止
while語句結(jié)構(gòu)
while 條件測試操作
do
命令
done
可以用while循環(huán)實現(xiàn)上述for循環(huán)的操作
#|:是管道操作符腻要,它將前一個命令的輸出作為后一個命令的輸入。while循環(huán)會不斷地讀取來自管道的輸入涝登,并將每一行的內(nèi)容賦值給變量 i
cat ./config | while read i
do
echo $i
arr=($i)
fq1=${arr[1]}
fq2=${arr[2]}
sample=${arr[0]}
fastqc fq1 fq2 -o $path/1.QC
done
在數(shù)據(jù)處理過程中通常還會用到if-else條件判斷語句
if語句是Linux中最基本的條件控制語句雄家,其語法結(jié)構(gòu)為
if [ condition ]
then
command1
command2
...
else
command3
command4
...
fi
output_dir="/home/RNA-seq/1.QC
cat ./config | while read i
do
echo $i
arr=($i)
fq1=${arr[1]}
fq2=${arr[2]}
sample=${arr[0]}
# 運行FastQC
fastqc $fq1 $fq2 -o $output_dir
# 定義FastQC報告文件路徑,其中basename命令可以去除fq1的路徑和fq.gz后綴只保留樣本名胀滚,例如C1_R1趟济、C2_R2等。$(...) 是命令替換的語法結(jié)構(gòu)咽笼,用于執(zhí)行括號內(nèi)的命令顷编,并將命令的輸出作為字符串插入當前位置,例如C1_R1_fastqc.html
report1="${output_dir}/$(basename $fq1 .fq.gz)_fastqc.html"
report2="${output_dir}/$(basename $fq2 .fq.gz)_fastqc.html"
# 使用if語法結(jié)構(gòu)檢查FastQC報告文件是否生成成功剑刑。其中[[...]]用于條件判斷媳纬,-f用于檢查文件是否存在并且是一個普通文件。這里檢查兩個報告文件 report1 和 report2 是否都存在施掏。$這里是引用變量
if [ [-f "$report1" && -f "$report2" ]]
then
echo "FastQC reports generated successfully for sample $sample:"
else
echo "Error: FastQC reports not found for sample $sample. Quality control failed."
fi
done
還有嵌套if語句可以判斷多個條件并執(zhí)行相應(yīng)的代碼塊
if [ condition1 ]
then
command1
elif [ condition2 ]
then
command2
elif [ condition3 ]
then
command3
else
command4
fi
這一部分相對來說較為復(fù)雜钮惠,但卻是數(shù)據(jù)分析過程中必不可少的部分。接下來我將介紹基于正則表達式的Linux進階命令七芭,即awk素挽、grep、sed狸驳,三個強大的文本處理利器