2017-09-13 67 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

换句话说,“破管”错误通常是无害的,可以忽略,或者,如果幸运的话,甚至会被压制。 –