Bash 스크립트는 이유 없이 변수 사용을 중지합니다.

Bash 스크립트는 이유 없이 변수 사용을 중지합니다.

이 스크립트가 붙어 있습니다. 임시 파일의 단일 고양이로 변수를 정의했으며 이는 스크립트에서 수행되는 다음 작업입니다.

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 사용된 파일 중 비어 있는 파일이 없습니다. grep이 예상대로 작동하면 "${PROJECT}_selected_Bif"라는 예상 파일도 비어 있지 않습니다.

답변1

코드의 마지막 줄에서 변수가 올바르게 확장되지 않는 이유를 실제로 이해하지 못하지만 PROJECT(생성된 파일의 잘못된 위치를 찾는 경우 제외) 변수를 큰따옴표로 묶지 않은 것은 알 수 있습니다. 올바르게 확장하세요. 큰따옴표를 사용하지 않으면 $PROJECT공백이나 개행 문자 또는 기타 쉘 관련 문자를 포함하는 경우 문제가 발생할 수 있습니다.

awk또한 단일 프로그램으로 수행할 수 있는 몇 가지 작업을 수행하려면 어려운 과정을 거쳐야 합니다 .

proj=$(<temp/project_name_final)

awk 'NR==FNR { species[$3]; next } /Bifidobacterium/ && !($2 in species) { print $2 }' \
    "${proj}_species.txt" "${proj}_genera.txt" >"temp/${proj}_selected_Bif"

awk프로그램은 두 개의 파일 ${proj}_species.txt${proj}_genera.txt. 첫 번째 파일을 읽을 때 세 번째 열은 연관 배열 또는 해시에 키를 만드는 데 사용됩니다 species. 두 번째 파일을 읽기 시작하면 strings를 포함하고 두 번째 열이 해시의 키가 Bifidobacterium아닌 행에만 관심이 있습니다 . species이 행에 대해 두 번째 열을 출력합니다.

모든 출력은 temp/${proj}_selected_Bif.

변수에 대한 확장된 큰따옴표를 모두 확인하세요 proj. 대문자 변수는 시스템 및 셸 환경 변수용으로 예약되어 있으므로 소문자 변수 이름을 사용합니다.

당신은 또한 볼 수 있습니다

답변2

초기 파일에는 CR/LF로 끝나는 줄이 포함되어 있습니다. CR은 변수의 일부로 실행되며 $PROJECTCR은 파일 이름에서 유효한 문자이므로 모든 중간 단계가 정상적으로 작동합니다. (그러나 파일 이름이 "잘못되었습니다".)

최종 출력도 정확하지만 파일 이름의 CR은 커서를 줄의 시작 부분으로 되돌리는 것으로 해석되므로 표시되는 것은 입니다 _selected_Bif.

파일 내용을 읽을 때 CR을 제거하여 이를 입증할 수 있습니다.

답변3

여기서 해결한 문제는 다른 지침이 없으면 grep이 정렬되지 않은 행을 처리할 수 없다는 것입니다. 따라서 출력 파일은 비어 있으며 어떤 이유로 grep은 이 빈 파일을 생성하지만 파일 이름이 잘못되었습니다. (이유를 아는 사람이 있나요?)

그래서 대신

$ grep -v -f 

나는 사용했다

$ grep -F -x -v -f 

관련 정보