2016-11-18 100 views
0

我最近嘗試Linux操作系統(從Windows),我覺得很難處理我下面的Windows命令到Linux的bash。轉換DPN的,從窗式命令來砸

Windows命令是:

set /p cutoff=Set BLAST E-Value Cutoff[1e-]: 
for %%F in (*.fa) do program.exe -parameter1 %%F -parameter2_cutoff 1e-%cutoff% -output_file %%~dpnF.fas & type %%F %%~dpnF.fas > %%~dpnF.txt 

這個腳本從用戶需要的數值,並用它來與所需截止的文件夾上運行的每一個.fa文件的程序。這裏%%〜dpnF只取文件名(不帶文件擴展名)。在這個腳本中,我加入了每個輸入文件(.fa)及其生成輸出(.fas)的內容,並最終將它們合併到最終輸出(.txt)中。在這裏,對於每個輸入文件,都會有最終的輸出文件。

要在Ubuntu中運行它,我嘗試

echo "Set BLAST E-Value Cutoff[1e-]:" 
read cutoff 
for $f in *.fa; do program -parameter1 $f -parameter2_cutoff 1e-$cutoff -output_file $~dpnF.fas & cat $f $~dpnF.fas > $~dpnF.txt; done 

立即它表明Linux是沒有窗戶,也是支持的腳本命令的DPN型端突然終止,沒有顯示輸出。

儘管我明白不同的文件擴展名在Linux中並不是很有意義,但我必須保持這種方式才能讓其他程序處理它們。

我明白任何類型的幫助。

感謝

+1

你的要求不明確!給出一個最小可驗證的樣本輸入和預期輸出。 – Inian

回答

3

序列%〜DPN被用來獲取:

  1. %〜d - 驅動
  2. %〜p - 路徑
  3. %〜N - 文件名

檢查the meaning of all expansions here

,該硬盤在Linux的沒有意義。可以使用命令dirname提取完整或部分路徑,並可使用命令basename提取文件名。

該序列%%~dpn意味着從根(/)獲取整個路徑名。

其實,你並不需要在Linux上,如果文件的列表與*.f創建,文件列表會相對於「當前工作目錄」(命令pwd),無需擴展它們。

並從文件名剝離擴展名,使用${f%.*}
這在最後一個點.和任何如下*切割字符串「$ F」。
然後,只需添加你想要的擴展:${f%.*}.fas

而且,性格&具有的意義「在後臺運行先前的命令」,這是不是你想要的。

最後,for $f應替換爲for f

這是一個更清潔的翻譯:

echo "Set BLAST E-Value Cutoff[1e-]:" 
read cutoff 
for f in *.fa; do 
    program -parameter1 "$f" \ 
      -parameter2_cutoff "1e-$cutoff" \ 
      -output_file "${f%.*}.fas" 
    cat "$f" "${f%.*}.fas" > "${f%.*}.txt" 
done 
+0

這是對OP要求的一個很好的解釋! '+ 1' – Inian

+0

很棒..謝謝。 –