2017-09-13 50 views
1

當我運行此腳本,我收到一條錯誤消息:「排序:寫失敗:標準輸出:殘破的管道」bash的錯誤排序「排序:寫失敗:標準輸出:殘破的管道」

如果有人能幫助我這將是真棒,我瘋了這個錯誤

輸入文件是所有包含FASTA格式的DNA序列的文件列表,所以每個文件有幾個序列(每個序列在一行中)格式爲: 1美元(標識符)中$ 2,3,4,5,6,7 & 8(更多值)9美元(DNA序列)

然後我想通過每個文件中的序列數($ common_hits)選擇每個序列(這個數字不是固定值,但是我爲此例子設置了6) - 必須刪除所有少於6個序列的文件 - 具有6個序列的文件是可用的 - 具有多於6個序列的文件必須被減少到6個序列(這些序列通過字段$ 5的較高值來選擇)

輸出文件必須具有全部6個序列,序列號(字段$ 9)必須位於標識符後面的行中

我現在不會刪除原始文件的序列數超過6個,因爲我想確保它能正常工作

par_list=`ls -1 *BR` 

common_hits="6" 

for i in ${par_list} 

do 

    if [ "`cat ${i} | wc -l`" -lt "${common_hits}" ] 
    then 
     rm -f ${i} 
    elif [ "`cat ${i} | wc -l`" -gt "${common_hits}" ] 
    then 
     cat ${i} | sort -nr -k 5 | head -n ${common_hits} | \ 
     awk '{print $1" " $2" " $3" " $4" " $5" " $6" " $7"   "$8 ; print $9}' > ${i}.ph 
    fi 

done 
+0

歡迎堆棧溢出的網站,請包你的代碼(S)爲代碼的標籤,每論壇規則和更清楚地說明問題,這樣我們就可以儘量幫你,謝謝。 – RavinderSingh13

+0

我可以看到我們可以做出很多改變成你的腳本,你可以請張貼2兩件事,第1你有什麼要求(樣本INPUT_FILE和預期的output_file),如果你只想使用相同的腳本,則使用se t -x在你的腳本開始並向我們顯示輸出,但是你還是要讓我們知道你的需求(什麼是Input_file和代碼標籤中的output_file)。 – RavinderSingh13

+0

感謝您的建議,我希望現在可以更容易理解 – Dani

回答

1

sort | head總是報告錯誤,如果head退出(或以其他方式關閉其標準輸入)sort之前已寫入它的所有輸出(這將在的情況下,如果由sort寫入的流比消耗更長的時間通過head)。這是通過設計:如果sort不能寫出所有的輸出,則預計會失敗;如果忽視此類故障,它也將忽略它不能寫它的其他原因輸出(磁盤已滿,網絡連接中斷等情況下

沒有什麼不尋常或不希望這件事。如果你不在乎有關錯誤,忽略它,並從管道檢查輸出的行數,以確定是否有錯誤情況相反。

+0

非常感謝,所以即使排序時出現錯誤,它也不會影響我的輸出嗎? – Dani

+0

正確 - 「錯誤」只是'排序'不能寫'$ common_hits'行以上。 –

+0

換句話說,「破管」錯誤通常是無害的,可以忽略,或者,如果幸運的話,甚至會被壓制。 –