2013-08-02 34 views
2

我有一個bash腳本,其中有幾個qsubs。他們中的每一個都在等待開始之前完成一個優秀的qsub。awk內部的qsub

我的第一個qsub包含將某個目錄中的文件發送到perl程序,並將outfiles打印在新目錄中。最後,我用我所有的工作名稱迴應數組。這個腳本以滿意的方式工作。

mkdir -p /perl_files_dir 
for ID_FILES in `ls Infiles_dir/*.txt`; 
do 
JOB_ID=`echo "perl perl_scirpt.pl $ID_FILES" | qsub -j oe ` 
JOB_ID_ARRAY="${JOB_ID_ARRAY}:$JOB_ID" 
done 
echo $JOB_ID_ARRAY 

我的第二個的qsub是爲了在新OUTFILE與我的perl腳本做我以前所有的文件進行排序,畢竟這些工作完成後(約100個就業機會)與depend=afterany啓動。再次,這部分工作正常。

SORT_JOB=`echo "sort -m -n perl_files_dir/*.txt >>sorted_file.txt" | qsub -j oe -W depend=afterany$JOB_ID_ARRAY` 
SORT_ARRAY="${SORT_ARRAY}:$SORT_JOB" 

我的問題是,在我的排序文件,我有我想刪除(2-6)幾列,所以我想出了利用awk最後一行通過管道輸送到sed與另一depend=afterany

SED=`echo "awk '{\$2="";\$3="";\$4="";\$5="";\$6=""; print \$0}' sorted_file.txt \ 
| sed 's/  //g' >final_file.txt" | qsub -j oe -W depend=afterany$SORT_ARRAY` 

最後一步創建final_file.txt,但保留爲空。我在回聲之前添加了SED=,因爲否則會給我Command not found

我嘗試沒有管道,所以它只會打印一切。不幸的是,它什麼都不打 我認爲它沒有打開我的排序文件,這就是爲什麼我的sed後我的最終文件是空的。如果是這樣的話,爲什麼awk不會讀它?

在我的腳本中,我使用變量來定義我的目錄和文件(使用正確的路徑)。我知道我的問題不在於查找我的文件或目錄,因爲它們在開始時被完全定義並在整個腳本中使用。我試圖寫出整個路徑而不是一個變量,並得到相同的結果。

回答

-1

awk,我使用的版本,不喜歡的字符轉義

的awk --version
GNU awk中3.1.7

[email protected]$ awk '{\$2="";\$3="";\$4=""; print \$0}' foo.txt 
awk: {\$2="";\$3="";\$4=""; print \$0} 
awk:^backslash not last character on line 

試試下面的語法

awk '{for(i=2;i<=7;i++) $i="";print}' foo.txt 

請注意,如果您使用的是Torque 4.x,則可能無法使用逗號分隔的-W depend=作業列表,您可能需要爲每個作業創建一個新的PBS聲明(-W) 。

eg ...

#Invalid syntax in newer versions of torque 
qsub -W depend=foo,bar 

資源

backslash in gawk fields
Print all but the first three columns
http://docs.adaptivecomputing.com/torque/help.htm#topics/commands/qsub.htm#-W

+0

awk沒有看到反斜槓。問題實際上是它沒有看到''「'。 – Gilles

0
for ID_FILES in `ls Infiles_dir/*.txt` 

簡化這

for ID_FILES in Infiles_dir/*.txt 

ls列出你傳遞給它的文件(除了當你傳遞它的目錄,然後列出它們的內容)。而不是告訴它顯示文件列表並解析輸出,請使用您已有的文件列表!這更可靠(解析ls的輸出將失敗,如果文件名包含空格或通配符),更清晰和更快。 Don't parse the output of ls

SORT_JOB=`echo "sort -m -n perl_files_dir/*.txt >>sorted_file.txt" | qsub -j oe -W depend=afterany$JOB_ID_ARRAY` 

你會讓你的生活更簡單,如果你用在正確的地方引用的適當形式。不要使用反引號,因爲很難知道如何引用內部的東西。 Use $(…) instead,它完全等同,只是它以一種理智的方式被解析。

我建議您使用here document作爲要輸入到qsub的shell代碼段。您需要擔心的報價較少,而且更具可讀性。

雖然我們在這裏,但總是在變量替換和命令替換周圍放置雙引號:"$some_variable""$(some_command)"。令人懷疑的是,shell語法中的$var並不意味着「取值爲變量var」,它表示「將變量值var解析爲通配符模式列表,並將每個模式替換爲匹配文件列表如果有匹配的文件「。如果替換髮生在雙引號(或在這裏的文檔中),則這些額外的東西將被關閉:"$var"表示「取值爲變量var」。

SORT_JOB=$(qsub -j oe -W depend="afterany$JOB_ID_ARRAY" <<'EOF' 
sort -m -n perl_files_dir/*.txt >>sorted_file.txt 
EOF 
) 

我們現在進入引用實際上導致問題的代碼段。

SED=`echo "awk '{\$2="";\$3="";\$4="";\$5="";\$6=""; print \$0}' sorted_file.txt \ 
| sed 's/  //g' >final_file.txt" | qsub -j oe -W depend=afterany$SORT_ARRAY` 

變成爭論到echo命令字符串是:

awk '{$2=;$3=;$4=;$5=;$6=; print $0}' sorted_file.txt | sed 's/  //g' >final_file.txt 

這是語法不正確的,這就是爲什麼你沒有得到任何輸出。

你沒有逃避awk代碼片段中的雙引號。如果您使用here文檔,這會更清晰。此外,您不需要SED=部分。你添加它是因爲你有一個命令替換(一個在之間的命令),它替代了命令的輸出。但是由於您對qsub命令的輸出不感興趣,請不要輸出它,只是執行它。

qsub -j oe -W depend="afterany$SORT_ARRAY" <<'EOF' 
awk '{$2="";$3="";$4="";$5="";$6=""; print $0}' sorted_file.txt | 
sed 's/  //g' >final_file.txt 
EOF 

我不熟悉的qsub,但據推測有一種方式來獲得錯誤輸出,它運行的命令的返回狀態。檢查錯誤輸出,你應該看到awk的錯誤。