在while循環的變數中添加函式
我正在編寫腳本來執行軟體。我正在嘗試在 while 循環中添加函式以修剪變數中的文本,以便它可以在命令的其他部分中作為變數應用。但是添加功能的正確方法應該是什麼?
--msa
當只執行一個文件時,這是一個工作程式碼。while read -r i; do raxml-ng --msa ../C049.laln_1l --model $i --prefix C049-rT; done < ../C049.model
簡單介紹一下,raxml-ng 是我使用的軟體,執行軟體的參數是由這些
--msa
,--model
, 和--prefix
文件中的每一個設置的。對於每個--msa
文件,它們都有相應的--model
和--prefix
. 我將它們命名為相同以簡化腳本編寫。例如,C049.laln_1l
需要與C049.model
and匹配C049-rT
。與上面的範例一樣,如果我有其他
--msa
具有相同副檔名的文件,我可以循環命令,如下所示:while read -r i; do while read -r j; do raxml-ng --msa ../$i.laln_1l --model $j --prefix $i-rT; done < ../$i.model done < msalist
現在我有一個要執行的
--msa
文件列表(在 中列出msalist
),其中一些具有不同的文件副檔名。該
msalist
文件包含:C049.laln_1l C092.laln_1l C016.laln_1l gc30_part.cseq gc3f.glist.cseq...
我命名了
model
andprefix
只使用了第一個之前的文本.
。例如。參數列表
model
:C049.model C092.model C016.model gc30_part.model gc3f.model...
參數的情況相同
prefix
。因此,當編寫 bash
--msa
腳本來循環. 但這似乎不起作用。msalist``"$( sed 's/\..*//g' "$i" )".model``C049.model``C049.laln_1l.model
trees=$2 threads=$3 while read -r i; do while read -r j; do raxml-ng --msa ../"$i" --model "$j" --prefix "$( sed 's/\..*//g' "$i" )"-rT; done < ../"$( sed 's/\..*//g' "$i" )".model; done < "$alnlist"
如何修剪文本
msalist
以供--model
and閱讀--prefix
?
要在任何 POSIX shell 中獲取第一個之前的部分
.
,您只需執行${var%%.*}
. 所以在這裡:while IFS= read -r i; do prefix=${i%%.*} while IFS= read -r j; do raxml-ng --msa ../"$i" --model "$j" --prefix "$prefix-rT"; done < "../$prefix.model"; done < "$alnlist
還要注意讀取一行的語法是
IFS= read -r line
,不是read -r line
。在這裡,您還可以這樣做:
while IFS=. read -r prefix rest; do while IFS= read -r j; do raxml-ng --msa ../"$prefix.$rest" --model "$j" --prefix "$prefix-rT"; done < "../$prefix.model"; done < "$alnlist
如果您想使用
sed
刪除從 first 開始的所有內容.
,請首先註意從其 input 的每一行中sed 's/\..*//'
刪除.
後跟任意數量的字元,而不是作為一個整體的輸入,並且您需要將 的內容作為輸入傳遞,不作為論據。將其參數視為文件名以從中讀取輸入,因此:$i``sed
printf '%s\n' "$i" | sed 's/\..*//'
例如。儘管要刪除從
.
整個輸入中的第一個開始的所有內容,但寧願必須是:printf '%s\n' "$i" | sed ' :1 $!{ # except on the line line, append the next line to the # pattern space and loop N b1 } s/\..*//'