Если то оператор bash не работает с командами qiime
Я только начал ругаться, и я застрял на некоторое время в простом утверждении if;then. Я использую bash для запуска команд QIIME, написанных на python. Эти команды позволяют мне иметь дело с микробной ДНК. Из необработанного набора данных из последовательности я должен сначала проверить, соответствуют ли они формату, с которым может работать QIIME, прежде чем я смогу перейти к остальным командам.
module load QIIME/1.9.1-foss-2016a-Python-2.7.11
echo 'checking mapping file and demultiplexing'
validate_mapping_file.py -m $PWD/map.tsv -o $PWD/mapcheck > tmp.txt
n_words=`wc -w tmp.txt`
echo "n_words:"$n_words
if [ n_words = '9 temp.txt' ];then
split_libraries_fastq.py -i $PWD/forward_reads.fastq.gz -b $PWD/barcodes.fastq.gz -m $PWD/map.tsv -o $PWD/demultiplexed
else
echo 'Error(s) in map'
exit 1
fi
Если карта хорошая, я ожидаю следующий результат (9 слов):
No errors or warnings were found in mapping file.
Если это плохо (16 слов):
Errors and/or warnings detected in mapping file. Please check the log and html file for details.
Я хочу использовать этот вывод для обработки следующих команд split_libraries_fastq.py.
Я перепробовал много разных версий заявления if;then, попросил помочь, но ничего не помогло. Кто-нибудь из вас имел представление о том, почему команда "then" не выполняется? Также я запускаю его через кластер.
Вот вывод, когда моя карта хороша, вторая команда не выполняется:
checking mapping file and demultiplexing
n_words:9 tmp.txt
Error(s) in map
Спасибо
2 ответа
Просмотрите синтаксис оболочки, в частности двойные кавычки и расширение параметров. Вам нужен доллар, чтобы расширить n_words
и двойные кавычки, чтобы сделать его единой строкой, несмотря на встроенное пространство. Например:
if [ "$n_words" = '9 temp.txt' ]; then
echo "good"
else
echo "bad"
fi
В качестве альтернативы рассмотрите возможность пропустить имя файла и выполнить целочисленное сравнение:
n_words=`wc -w < tmp.txt`
echo "n_words: $n_words"
if [ "$n_words" -eq 9 ]; then
#...
Наконец, позвольте мне предупредить вас, что подсчет количества слов - плохой взлом, так как невинные изменения в скрипте Python могут сломать ваш скрипт оболочки. Я не знаком с Qiime, но они должны предоставить значимый статус выхода. Пытаться:
validate_mapping_file.py -m $PWD/map.tsv -o $PWD/mapcheck > /dev/null
exit_status=$?
echo "exit status: $exit_status"
Я думаю, что код может быть улучшен. Что не так в вашем коде, так это в основном оператор доллара, используемый для вызова переменных после их установки.
Вы считаете строки внутри файла temp.txt. Лучшая версия будет:
n_words=$(wc -l temp.txt)
if [ "$n_words" -eq 9 ]; then
echo "${n_words} equal to 9"
else
echo "${n_words} is not equal to 9"
fi