<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          討論群問題:Linux 下的批量操作,第2種很贊

          共 3482字,需瀏覽 7分鐘

           ·

          2022-02-16 22:04

          通常情況下我們的處理是針對多個樣品的,比如多樣品質(zhì)控、多樣品比對、多樣品定量等。這時就需要用到循環(huán)來簡化、優(yōu)化計算了。

          假如我們有一個命令如下(這是群里的提問,這條命令是把質(zhì)量值編碼 Phred64 轉(zhuǎn)為 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 次樣本名。

          倒也不是太難的事!

          但應(yīng)該有好一點的辦法。

          這就用到我們前面提到的for循環(huán)了。for循環(huán)有個固定格式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

          輸出為 各個樣本的測序結(jié)果文件名

          sample1.fq
          sample2.fq
          sample3.fq

          這樣就通過命令的方式實現(xiàn)了各個樣本文件的遍歷。下一步,怎么把上面轉(zhuǎn)換編碼格式的命令套進來呢?

          # 把變量 i 把每次循環(huán)獲得的值轉(zhuǎn)換為樣本名字
          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

          打印出來,與前面自己手寫的比較下,一模一樣。這樣就實現(xiàn)了循環(huán)了,去掉 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

          假如樣本名沒有統(tǒng)一的規(guī)律,或者更復(fù)雜一些呢?

          一般是需要準備一個metadata.txt的文件,里面至少包含兩列信息,樣本名字樣本分組。

          需要注意的是:metadata.txt中樣本名字需要與樣本的測序結(jié)果文件存在統(tǒng)一的對應(yīng)關(guān)系

          假如我們有4個樣品,名字如下,我們寫一個metadata.txt文件 (這里我們只用到了第一列):

          Sample      Group
          WT1 WT
          WT2 WT
          KO1 KO
          KO2 KO

          對應(yīng)的序列分別為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.fq

          for語句用起來方便,但樣品多時只能所有樣品串行運行或同時并行運行(當然也可能可以用wait控制并行的數(shù)量)。這里推薦另外一個工具rush, 這是重慶醫(yī)科大學(xué)沈偉博士開發(fā)的一個并行工具,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沒什么不同。關(guān)鍵參數(shù)有 2 個:

          1. -j 2表示同時運行 2 個樣本,所以下面的輸出順序才有些亂;

            如果去掉 echo,會發(fā)現(xiàn)同時有 2 個樣本正在轉(zhuǎn)換。

            當然這里的 2 可以改為任意非 0 的正數(shù),控制同時運行的命令數(shù)目。

          2. {1}: 樣本名會替換在這里。

          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 KO2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout KO2_33.fq
          vsearch --fastq_convert KO1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout KO1_33.fq

          如果你習(xí)慣用parallel也可以。

          往期精品(點擊圖片直達文字對應(yīng)教程)

          機器學(xué)習(xí)

          后臺回復(fù)“生信寶典福利第一波”或點擊閱讀原文獲取教程合集


          瀏覽 68
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人操B视频| 影音先锋av资源在线 | 中文字幕在线亚洲 | 日本中文乱伦字幕 | 留学生苏琪和外国男友第二季 |