Bash скрипт перестает использовать переменную без причины

Я застрял на этом сценарии. Я определил переменную с одним cat временного файла, и это следующие операции, выполняемые сценарием

PROJECT=$(cat temp/project_name_final) ; #Bifidobacterium contigs selection grep "Bifidobacterium" ${PROJECT}_genera.txt | gawk '{print $2}' > temp/${PROJECT}_Bif_genera ; gawk '{print $3}' ${PROJECT}_species.txt > temp/${PROJECT}_Bif_species ; grep -v -f temp/${PROJECT}_Bif_species temp/${PROJECT}_Bif_genera > temp/${PROJECT}_selected_Bif ; 

Первый grep работает отлично, также как и awk. Переменная используется хорошо в данном имени файла. Кажется, что последний grep работает плохо, и сгенерированный файл называется «_selected_Bif», поэтому переменная не используется, как раньше. Я пытаюсь найти способ объяснить, почему я получаю эту проблему.

TL; DR Ни один из использованных файлов не пуст. Ожидаемый файл с именем «$ {PROJECT} _selected_Bif» также не может быть пустым, если grep работает должным образом.

Я действительно не могу понять, почему переменная PROJECT не раскрывается должным образом в последней строке кода (если вы не ищете неправильное место для сгенерированного файла), но я вижу, что вы неправильно заключаете в кавычки переменные расширения. Не двойные кавычки могут вызвать проблемы, как только $PROJECT содержать пробелы или символы новой строки или любой другой символ, особенный для оболочки.

Вы также перепрыгиваете через много обручей для чего-то, что можно сделать с помощью одной awk программы:

 proj=$("temp/${proj}_selected_Bif" 

Эта awk программа читает два файла ${proj}_species.txt и ${proj}_genera.txt . При чтении первого файла его третий столбец используется для создания ключа в ассоциативном массиве или species hashей. Когда мы начинаем читать второй файл, нас интересуют только строки, которые содержат строку Bifidobacterium и чей второй столбец не является ключом в хеше species . Для этих строк мы выводим второй столбец.

Весь вывод идет в temp/${proj}_selected_Bif .

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

Смотрите также

  • Почему мой сценарий оболочки заглушает пробелы или другие специальные символы?

Ваш исходный файл содержит строку, которая заканчивается на CR / LF. CR передается как часть переменной $PROJECT , и, поскольку CR является допустимым символом в имени файла, все промежуточные шаги работают правильно. (Но имена файлов “неправильные”.)

Последний вывод также корректен, но CR в имени файла интерпретируется, чтобы заставить курсор вернуться к началу строки, поэтому все, что вы видите, это _selected_Bif .

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

Я решил. Проблема в том, что grep без других инструкций не может обрабатывать строки без их сортировки. Таким образом, выходной файл будет пустым, и, не знаю почему, grep создаст этот пустой файл, но с неправильным именем файла. (кто-нибудь знает почему?)

Так что вместо

 $ grep -v -f 

Я использовал

 $ grep -F -x -v -f