Bash

在while循環的變數中添加函式

  • September 30, 2022

我正在編寫腳本來執行軟體。我正在嘗試在 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.modeland匹配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...

我命名了modelandprefix只使用了第一個之前的文本.

例如。參數列表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以供--modeland閱讀--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/\..*//'

引用自:https://unix.stackexchange.com/questions/719274