2017-06-27 54 views
1

我是GNU並行的新手,我只是對bash的半知識,所以我非常感謝一些建議。在修改colsep輸入時從輸入文件運行GNU並行

我想要逐行閱讀一個輸入文件,該文件包含第一列中的文件路徑和第二列中第二個文件的路徑,並且每行使用列作爲命令中的輸入。但是,我需要替換第一列中的部分文件名,以使我的命令有效。

的文件應該是這樣的,由製表符分隔兩個文件路徑:

path_to_file/filename1_combined_R1_001.bam \t path_to_file/filename1.fna 
path_to_file/filename2_combined_R1_001.bam \t path_to_file/filename2.fna 

我需要能夠做的是從一列刪除字符串「_R1_001.bam」,取而代之的是我自己的字符串(例如_R1_fastq)來調用名爲removeM的腳本。僅供參考,我不知道如果我使用--colsep correctly.The命令如下:

parallel -j10 --colsep '\t' input_file.tsv removeM -1 {1}_R1.fastq -2 {1}_R2.fastq -i {2} -f CoralRemoved_{1}_R1.fastq -r CoralRemoved_{}_R2.fastq` 

至於我可以告訴我可以使用基名去除(類似{1}),但我不知道如何刪除更多的擴展名(.bam)。

預先感謝您。

回答

0

我有一個很難理解你想運行的命令是什麼,但我想你也許可以改變的文件,用sed,因爲你給它變成GNU並行這樣的:

sed 's/_R1_001.bam/_R1_fastq/' input_file.tsv | parallel -j10 -colsep '\t' removeM ... 

請注意,這不會永久性地更改您的文件input_file.tsv,而是在它將其傳遞到GNU並行時,它將其修改爲即時

還要注意的是,你可以看到,如果你只要運行它在做什麼:

sed 's/_R1_001.bam/_R1_fastq/' input_file.tsv 
+0

謝謝馬克。我很感謝你的回答,但它並沒有達到我想要的。你的建議會讓我得到我想要的fastq文件的所需格式(第一列),但是我必須找到一種方法來抓取第二列中的相關文件路徑。我也許可以通過在'back ticks'內使用第一列作爲搜索和管道來切割-f來獲得第二列來做到這一點,但我並不認爲這將以相同的方式並行運行。 sed's/_R1_001.bam //'input_file.tsv | parallel -j10 removeM -1 {} _R1_fastq -2 {} _R2_fastq -i'grep {} |切割-f 2「 –

2

我最終搞清楚了這一點爲自己。我用--colsep將文件拆分成字段,然後用正則表達式替換字符串。等號前面的1表示打印第一個字段,而等號內的正則表達式替換字符串。

parallel -j10 --colsep '\t'-a $2 removeM -1 bamToFastq_{=1s/_R1_001.bam//=}_R1.fastq.gz -2 bamToFastq_{=1s/_R1_001.bam//=}_R2.fastq.gz -i {2} -f CoralRemoved_bamToFastq_{1}_R1.fastq -r CoralRemoved_bamToFastq_{1}_R2.fastq

0

這不回答完整的問題,所以把它當作一個註釋。

版本20170322引入了動態替換字符串,這在這裏可能很有用。

動態替換字符串是一個帶參數的--rpl定義。在替換字符串中使用()獲取參數,並在代碼中使用以$$ 1(以及$$ 2,$$ 3 ...如果有更多()-groups)運行。這裏有幾個例子,每個對應一個猛砸參數擴展:

# Bash ${a:-myval}          
--rpl '{:-([^}]+?)} $_ ||= $$1', 
# Bash ${a:2}                  
--rpl '{:(\d+?)} substr($_,0,$$1) = ""', 
# Bash ${a:2:3}                  
--rpl '{:(\d+?):(\d+?)} $_ = substr($_,$$1,$$2);', 
# Bash ${a#bc}                  
--rpl '{#([^#][^}]*?)} s/^$$1//;', 
# Bash ${a%def}                  
--rpl '{%([^}]+?)} s/$$1$//;', 
# Bash ${a/def/ghi} ${a/def/}              
--rpl '{/([^}]+?)/([^}]*?)} s/$$1/$$2/;', 
# Bash ${a^a}                  
--rpl '{^([^}]+?)} s/^($$1)/uc($1)/e;', 
# Bash ${a^^a}                  
--rpl '{^^([^}]+?)} s/($$1)/uc($1)/eg;', 
# Bash ${a,A}                  
--rpl '{,([^}]+?)} s/^($$1)/lc($1)/e;', 
# Bash ${a,,A}                  
--rpl '{,,([^}]+?)} s/($$1)/lc($1)/eg;', 

這些,順便說一句,啓用,如果你使用--plus

所以要去除一個字符串(或者更準確:一個正則表達式)從最後你可以使用:

$ parallel --plus echo {%_R1_001.bam} ::: MyOrganism_R1_001.bam 
MyOrganism 

或者替換字符串:

$ parallel --plus echo {/_R1_001.bam/_R1.fastq.gz} ::: MyOrganism_R1_001.bam 
MyOrganism_R1.fastq.gz 

或者你可以讓你自己您在哪裏表達了您想要移除的多少個。或者_:

$ parallel --rpl '{_(\d+)} s/([_.][^_.]*){$$1}$//' \ 
    echo {_1} {_2} {_3} ::: filename2_combined_R1_001.bam 
filename2_combined_R1_001 filename2_combined_R1 filename2_combined 

然後您可以擁有這個--rpl在您的~/.parallel/config中定義。