日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

讨论群问题:Linux 下的批量操作,第2种很赞

發布時間:2025/3/15 linux 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 讨论群问题: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.fq

for語句用起來方便,但樣品多時只能所有樣品串行運行或同時并行運行(當然也可能可以用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}: 樣本名會替換在這里。

  • 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

    如果你習慣用parallel也可以。

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

    機器學習

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

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的讨论群问题:Linux 下的批量操作,第2种很赞的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。