讨论群问题:Linux 下的批量操作,第2种很赞
通常情況下我們的處理是針對多個樣品的,比如多樣品質控、多樣品比對、多樣品定量等。這時就需要用到循環來簡化、優化計算了。
假如我們有一個命令如下(這是群里的提問,這條命令是把質量值編碼 Phred64 轉為 Phred 33)
# 輸入文件 sample1.fq # 輸出文件 sample1_33.fq vsearch --fastq_convert sample1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample1_33.fq這條命令可以處理單個文件,假如有 3 個文件呢?這難不倒勤奮的小能手。
把命令寫 3 遍,改6 次樣本名。
# 輸入文件 sample1.fq # 輸出文件 sample1_33.fq vsearch --fastq_convert sample1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample1_33.fq vsearch --fastq_convert sample2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample2_33.fq vsearch --fastq_convert sample3.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample3_33.fq如果有 100 個文件呢?把命令寫 100 遍,改200 次樣本名。
倒也不是太難的事!
但應該有好一點的辦法。
這就用到我們前面提到的for循環了。for循環有個固定格式for .. in .. do .. done,我們看看是怎么工作的。
for i in `seq 1 3`; do echo $i; done這個命令本身沒啥意義,只是展示for的語法,變量i依次被賦值為了1,2,3,并且打印了出來,輸出為:
1 2 3假如你的樣本名正好是sample1, sample2, sample3,那可以套用下。
for i in `seq 1 3`; do echo "sample"$i".fq"; done輸出為 各個樣本的測序結果文件名
sample1.fq sample2.fq sample3.fq這樣就通過命令的方式實現了各個樣本文件的遍歷。下一步,怎么把上面轉換編碼格式的命令套進來呢?
# 把變量 i 把每次循環獲得的值轉換為樣本名字 for i in `seq 1 3`; do vsearch --fastq_convert "sample"$i".fq" --fastq_ascii 64 --fastq_asciiout 33 --fastqout "sample"$i"_33.fq"; done這個代碼寫好了,對不對呢,可以打印一下看看:
# 命令前加一個 echo for i in `seq 1 3`; do echo vsearch --fastq_convert "sample"$i".fq" --fastq_ascii 64 --fastq_asciiout 33 --fastqout "sample"$i"_33.fq"; done打印出來,與前面自己手寫的比較下,一模一樣。這樣就實現了循環了,去掉 echo 就可以實際運行了。
vsearch --fastq_convert sample1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample1_33.fq vsearch --fastq_convert sample2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample2_33.fq vsearch --fastq_convert sample3.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample3_33.fq假如樣本名沒有統一的規律,或者更復雜一些呢?
一般是需要準備一個metadata.txt的文件,里面至少包含兩列信息,樣本名字和樣本分組。
需要注意的是:metadata.txt中樣本名字需要與樣本的測序結果文件存在統一的對應關系
假如我們有4個樣品,名字如下,我們寫一個metadata.txt文件 (這里我們只用到了第一列):
Sample Group WT1 WT WT2 WT KO1 KO KO2 KO對應的序列分別為WT1.fq, WT2.fq, KO1.fq, KO2.fq。
# 命令前加一個 echo for i in `tail -n +2 metadata.txt | cut -f 1`; do echo vsearch --fastq_convert $i".fq" --fastq_ascii 64 --fastq_asciiout 33 --fastqout $i"_33.fq"; done輸出如下,可以直接拷貝運行,或去掉上面語句中的echo就可以直接運行了。
vsearch --fastq_convert WT1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout WT1_33.fq vsearch --fastq_convert WT2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout WT2_33.fq vsearch --fastq_convert KO1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout KO1_33.fq vsearch --fastq_convert KO2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout KO2_33.fqfor語句用起來方便,但樣品多時只能所有樣品串行運行或同時并行運行(當然也可能可以用wait控制并行的數量)。這里推薦另外一個工具rush, 這是重慶醫科大學沈偉博士開發的一個并行工具,https://github.com/shenwei356/rush,很好用。跨平臺,免安裝,下載即可用。
tail -n+2 metadata.txt | cut -f1 | rush -j 2 \"echo vsearch --fastq_convert {1}.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout {1}_33.fq"運行輸出如下,除了命令順序有變化,看上去與for沒什么不同。關鍵參數有 2 個:
-j 2表示同時運行 2 個樣本,所以下面的輸出順序才有些亂;
如果去掉 echo,會發現同時有 2 個樣本正在轉換。
當然這里的 2 可以改為任意非 0 的正數,控制同時運行的命令數目。
{1}: 樣本名會替換在這里。
如果你習慣用parallel也可以。
往期精品(點擊圖片直達文字對應教程)
機器學習
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的讨论群问题:Linux 下的批量操作,第2种很赞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字是绿色是字符串
- 下一篇: linux 其他常用命令