2016-05-06 2 views
0

bash ниже почти завершено. Единственная часть, с которой я борюсь, заключается в том, что в process.log, если найдена строка The bam file is corrupted and has been removed, please check log for reason., то удаляется .bam ($f) в bash. Я добавил:bash, чтобы удалить файл в каталог, если строка поиска найдена в другом файле

echo "The bam file is corrupted and has been removed, please check log for reason." 
      [[ -f "$f" ]] && rm -f "$f" 

в попытке сделать это, но похоже, что он удаляет последний .bam независимо (в process.log NA19240.bam (этот файл имеет строку поиска в нем), но но последний .bam (NS12911) в process.log (хотя строки поиска там нет). Я не могу это исправить и нуждаюсь в некоторой экспертной помощи. Извиняюсь за длинный пост, просто пытаюсь добавьте все детали. Спасибо :).

Баш

logfile=/home/cmccabe/Desktop/NGS/API/5-4-2016/process.log 
for f in /home/cmccabe/Desktop/NGS/API/5-4-2016/*.bam ; do 
echo "Start bam validation creation: $(date) - File: $f" 
bname=`basename $f` 
pref=${bname%%.bam} 
bam validate --in $f --verbose 2> /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/${pref}_validation.txt 
echo "End bam validation creation: $(date) - File: $f" 
done >> "$logfile" 
for file in /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/*.txt ; do 
echo "Start verifying $(date) - File: $file" 
bname=`basename $file` 
if $(grep -iq "(SUCCESS)" "${file}"); then 
    echo "The verification of the bam file has completed sucessfully." 
else 
    echo "The bam file is corrupted and has been removed, please check log for reason." 
      [[ -f "$f" ]] && rm -f "$f" 
    echo "End of bam file verification: $(date) - File: ${file}" 
fi 
done >> "$logfile" 

process.log

Start bam validation creation: Fri May 6 13:20:48 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/NA12878.bam 
End bam validation creation: Fri May 6 13:24:15 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/NA12878.bam 
Start bam validation creation: Fri May 6 13:24:15 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/NA19240.bam 
End bam validation creation: Fri May 6 13:24:15 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/NA19240.bam 
Start bam validation creation: Fri May 6 13:24:15 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/NS12911.bam 
End bam validation creation: Fri May 6 13:28:03 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/NS12911.bam 
Start verifying Fri May 6 13:28:03 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/NA12878_validation.txt 
The verification of the bam file has completed successfully. 
End of bam file verification: Fri May 6 13:28:03 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/NA12878_validation.txt 
Start verifying Fri May 6 13:28:03 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/NA19240_validation.txt 
The bam file is corrupted and has been removed, please check log for reason. 
End of bam file verification: Fri May 6 13:28:05 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/NA19240_validation.txt 
Start verifying Fri May 6 13:28:05 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/NS12911_validation.txt 
The verification of the bam file has completed successfully. 
End of bam file verification: Fri May 6 13:28:05 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/NS12911_validation.txt 
+1

Может быть, вы хотите внимательно посмотреть, где вы используете переменную '$ f' против' $ file'? – mustaccio

+0

'$ f' - это оригинальный' .bam' и '$ file' - это' .txt', в котором есть строка поиска. Если строка поиска находится в '$ file', то' $ f' удаляется. Спасибо :). – Chris

ответ

1

Это немного трудно для меня, чтобы полностью воспроизвести среду таким образом, я того, чтобы сделать некоторые предположения о вашей установке и точно, каковы ваши ограничения. Я вижу много способов упростить процесс или сделать его более эффективным, но вместо того, чтобы вводить многие ненужные изменения, я в основном сосредоточился на том, чтобы заставить скрипт работать.

С учетом этого я переделал обработку туда, где каждый ${pref}_validation.txt проверен сразу после его создания.

Вы можете попробовать следующее (примечание: Обновленный сценарий первый раз я получил происходит слишком быстро и скопировали неправильную версию..) И дайте мне знать, что результат:

#!/bin/bash 

logfile="/home/cmccabe/Desktop/NGS/API/5-4-2016/process.log" 

for f in /home/cmccabe/Desktop/NGS/API/5-4-2016/*.bam ; do 
    echo "Start bam validation creation: $(date) - File: $f" 
    bname="$(basename "$f")" 
    pref="${bname%%.bam}" 
    bam validate --in "$f" --verbose 2> "/home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/${pref}_validation.txt" 
    echo "End bam validation creation: $(date) - File: $f" 

    file="/home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/${pref}_validation.txt" 

    echo "Start verifying $(date) - File: $file" 

    if grep -iq "(SUCCESS)" "${file}"; then 
     echo "The verification of the bam file has completed sucessfully." 
    else 
     if [[ -f "$f" ]]; then 
      rm -f "$f" 
      echo "The bam file is corrupted and has been removed, please check log for reason." 
     fi 
    fi 

    echo "End of bam file verification: $(date) - File: ${file}" 

done >> "$logfile" 

Надеемся, что объединение двух шагов в цикл для цикла не отклоняется от некоторых требований к процессу, которые у вас есть. Что я нахожу полезным об этом является то, что она позволяет более обтекаемой потоком кода и лог-файл должен теперь читать как:

Start bam validation creation: Fri May 6 13:20:48 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/NA12878.bam 
End bam validation creation: Fri May 6 13:24:15 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/NA12878.bam 
Start verifying Fri May 6 13:28:03 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/NA12878_validation.txt 
The verification of the bam file has completed successfully. 
End of bam file verification: Fri May 6 13:28:03 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/bam_validation/NA12878_validation.txt 
Start bam validation creation: Fri May 6 13:24:15 CDT 2016 - File: /home/cmccabe/Desktop/NGS/API/5-4-2016/NA19240.bam 
... 

Высококвалифицированные Модифицированная версия
я взял попробовать в весьма обтекаемой и более устойчивую версию скрипта. Мне было бы интересно, если бы вы могли проверить это:

#!/bin/bash 

# basepath allows you to quickly move the script by updating this path 
basepath="/home/cmccabe/Desktop/NGS/API/5-4-2016" 

# give the logfile a name 
logfile="${basepath}/process.log" 

# for each .bam file in basepath do 
for f in ${basepath}/*.bam ; do 

    # validate the file with the bam command 
    # capture the stdout, stderr and return code via some crazy bash fu 
    eval "$({ cmd_err=$({ cmd_out=$(\ 
     bam validate --in "$f" --verbose \ 
    ); cmd_rtn=$?; } 2>&1; declare -p cmd_out cmd_rtn >&2); declare -p cmd_err; } 2>&1)" 

    # check the return code for positive completion 
    if [ "${cmd_ret}" -eq "0" ]; then 
     printf -- "%s - bam validation completed for: %s\n" "$(date)" "${f}" 

     # check for string "(SUCCESS)" in bam command standard output 
     if grep -iq "(SUCCESS)" <<< "${cmd_out}"; then 
      printf -- "%s - Verification of the bam file has completed sucessfully.\n" "$(date)" 
     else 
      # verify the bam file exists and can be deleted 
      if [[ -f "$f" ]] && rm -f "$f" ; then 
       printf -- "%s - The bam file is corrupted and has been removed, please check log for reason.\n" "$(date)" 
      else 
       printf -- "%s - WARNING: The bam file is corrupted but the file could not be deleted.\n" "$(date)" 
      fi 
     fi 
    else 
     # The bam validate command above did not complete with a 
     # satisfactory result. This should not really ever happen unless 
     # the bam command does not exist or some serious error occurred 
     # when executing the bam command. 
     # Consider addition actions in addition to logging the outcome 
     printf -- "%s - WARNING: bam validation failed for file: %s - [%s]\n" "$(date)" "${f}" "${cmd_err}" 
    fi 

done >> "$logfile" 
+0

отлично работает ... спасибо за вашу помощь и объяснения :). – Chris