ошибка bash при сортировке: ошибка записи: стандартный вывод: сломанная труба

Когда я запускаю этот скрипт, я получаю сообщение об ошибке: «сортировка: ошибка записи: стандартный вывод: сломанная труба»

Если кто-то может мне помочь, это было бы здорово, я схожу с ума от этой ошибки

входной файл представляет собой список файлов, которые все содержат последовательности ДНК в формате FASTA, поэтому каждый файл содержит несколько последовательностей (каждая последовательность в одной строке) в формате: в $1 (идентификатор) в $2,3,4,5, 6,7 и 8 (больше значений) в $9 (последовательность ДНК)

Затем я хочу выбрать каждую из этих последовательностей по количеству последовательностей ($ 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 

person Dani    schedule 13.09.2017    source источник
comment
Добро пожаловать на сайт переполнения стека, пожалуйста, заверните свой код в теги кода в соответствии с правилами форума и объясните проблемы более четко, чтобы мы могли попытаться вам помочь, спасибо.   -  person RavinderSingh13    schedule 13.09.2017
comment
Я мог видеть, что мы могли бы внести много изменений в ваш скрипт, не могли бы вы опубликовать 2 вещи, 1-е, каково ваше требование (с образцом Input_file и ожидаемым output_file), 2-е, если вы хотите только тот же скрипт, используйте set -x в запустите свой скрипт и покажите нам результат, хотя вы все равно должны сообщить нам о своем требовании (что такое Input_file и о output_file в тегах кода), пожалуйста.   -  person RavinderSingh13    schedule 13.09.2017
comment
спасибо за совет, надеюсь теперь проще понять   -  person Dani    schedule 13.09.2017
comment
Спасибо за добавление информации, не могли бы вы также добавить образец ввода и ожидаемый образец вывода в тегах кода.   -  person RavinderSingh13    schedule 13.09.2017
comment
что вы подразумеваете под кодовыми тегами?, файл ввода и файл вывода?   -  person Dani    schedule 13.09.2017
comment
Каждый из этих cat вызовов программы не нужен, wc и sort оба принимают имя входного файла в качестве крайнего правого параметра.   -  person cdarke    schedule 13.09.2017
comment
Нет смысла и в head | awkawk может сам выбирать, какие строки читать. `awk '{ печать ... } NR › 5 { выход }'   -  person Charles Duffy    schedule 13.09.2017
comment
Еще одно замечание: см. Почему не следует анализировать вывод ls. Цикл лучше записать (с меньшим количеством непредвиденных ошибок) как for i in *BR.   -  person Charles Duffy    schedule 13.09.2017
comment
Спасибо за советы, я постараюсь улучшить свой код   -  person Dani    schedule 14.09.2017


Ответы (1)


sort | head всегда сообщает об ошибке, если head завершает работу (или иным образом закрывает свой стандартный ввод) до того, как sort запишет все свои выходные данные (как это будет в случае, если поток, записанный sort, намного длиннее, чем поток, потребляемый head). Так задумано: если sort не может записать весь свой вывод, ожидается, что он потерпит неудачу; если бы он игнорировал такие сбои, он также проигнорировал бы случаи, когда он не мог записать свой вывод по другим причинам (диск заполнен, разорванное сетевое соединение и т. д.).

В этом нет ничего необычного или нежелательного. Если вас не волнует ошибка, проигнорируйте ее и проверьте количество строк вывода из конвейера, чтобы определить, возникла ли вместо этого ошибка.

person Charles Duffy    schedule 13.09.2017
comment
Большое спасибо, так что даже если есть ошибка с сортировкой, это не должно повлиять на мой вывод? - person Dani; 13.09.2017
comment
Правильно -- ошибка в том, что sort не может написать более $common_hits строк. - person Charles Duffy; 13.09.2017
comment
Другими словами, ошибки Broken pipe часто безобидны и могут быть проигнорированы или, если вам повезет, даже подавлены. - person John Kugelman; 13.09.2017
comment
Кстати, попробуйте запустить свой код через shellcheck.net и исправить то, что он находит; у вас куча багов с цитированием. Они могут не вызывать немедленных эффектов сейчас, но это не значит, что они никогда не будут. - person Charles Duffy; 13.09.2017
comment
но тогда сортировка не сортирует проверку всех последовательностей? Мне нужно отсортировать последовательности, сравнивая все последовательности - person Dani; 13.09.2017
comment
Чтобы получить эти common_hits строк вывода, абсолютно действительно необходимо прочитать весь входной поток. Какую часть моего ответа или комментария вы читаете как утверждение, что это не так? - person Charles Duffy; 13.09.2017
comment
Педантично, эта ошибка вызвана системным вызовом write, вызывающим SIGPIPE. Для (последнего) write возможно успешное возвращение, но для head никогда не читайте его и не наблюдайте эту ошибку. - person Maxim Egorushkin; 13.09.2017
comment
@MaximEgorushkin, как человек, известный своей педантичностью, я с удовольствием перефразирую, чтобы быть более точным. Лучше? - person Charles Duffy; 13.09.2017
comment
@CharlesDuffy Определенно лучше. - person Maxim Egorushkin; 13.09.2017
comment
Ты был прав! Выходные файлы правильные, я запаниковал, когда увидел ошибку. Спасибо всем - person Dani; 14.09.2017
comment
Привет еще раз, я запускаю сценарий нормально, но иногда в файле .error также есть это сообщение: sort: fflush failed: стандартный вывод: Broken pipe sort: ошибка записи. Это тоже нормально? на вывод не влияет? - person Dani; 19.09.2017
comment
Да, это нормально. Нет, это не меняет вывод - просто означает, что сбой произошел при очистке буферов, а не при записи в буфер (и позволяя библиотеке C решать, когда сбрасывать) - но это точно такая же ошибка с точным те же эффекты, просто происходящие в разное время. - person Charles Duffy; 19.09.2017
comment
Большое спасибо! - person Dani; 19.09.2017