이 스크립트가 붙어 있습니다. 임시 파일의 단일 고양이로 변수를 정의했으며 이는 스크립트에서 수행되는 다음 작업입니다.
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은 변수의 일부로 실행되며 $PROJECT
CR은 파일 이름에서 유효한 문자이므로 모든 중간 단계가 정상적으로 작동합니다. (그러나 파일 이름이 "잘못되었습니다".)
최종 출력도 정확하지만 파일 이름의 CR은 커서를 줄의 시작 부분으로 되돌리는 것으로 해석되므로 표시되는 것은 입니다 _selected_Bif
.
파일 내용을 읽을 때 CR을 제거하여 이를 입증할 수 있습니다.
답변3
여기서 해결한 문제는 다른 지침이 없으면 grep이 정렬되지 않은 행을 처리할 수 없다는 것입니다. 따라서 출력 파일은 비어 있으며 어떤 이유로 grep은 이 빈 파일을 생성하지만 파일 이름이 잘못되었습니다. (이유를 아는 사람이 있나요?)
그래서 대신
$ grep -v -f
나는 사용했다
$ grep -F -x -v -f