질문:
디렉터리의 각 .fna 파일에 대해 bash 루프에서 프로그램을 실행할 수 있기를 원하지만 출력 파일의 파일 이름이 확장자 없이 동일해지기를 원합니다. 문제는 프로그램이 작은따옴표를 사용하여 지정한다는 것입니다. 출력 문서. 따라서 스크립트를 실행하면 다음과 같은 메시지가 인쇄됩니다.
outputfile
암호:
for fna in $(find . -name "*.fna")
do
outputname = ${fna%.fna}
outputfile = $outputname.rrna
barrnap $fna --outseq 'outputfile'
done
입력 예
이름이 하나:
GCF_000003135.1_ASM313v1_genomic.fna
콘텐츠를 예로 들어보겠습니다.
>NZ_GG666849.1 Bifidobacterium longum subsp. longum ATCC 55813 SCAFFOLD1, whole genome shotgun
sequence
AACCCCGTGGAGTTCACACAACAAGGTGTATTTAGTCAAGTCGGTGTTTCGTGTTTCGTCACTGATTTTTTTCACTGCGG
AAA
원하는 출력:
프로그램의 출력 파일 이름은 다음과 같습니다.
GCF_000003135.1_ASM313v1_genomic.rrna
혼란을 드려 죄송합니다. 이것을 설명하는 가장 좋은 방법을 생각하는 데 어려움을 겪고 있으며 누구든지 제목 개선을 제안할 수 있으면 즉시 제목을 변경하겠습니다.
답변1
이 프로그램은 작은따옴표를 사용하지 않습니다. 작은따옴표는 쉘이 인용된 문자열에 대해 변수 확장을 수행하는 것을 방지하는 데 사용됩니다. 쉘은 프로그램을 호출하기 전에 따옴표를 제거합니다.
이 경우, 작은따옴표가 인용하는 문자열은 쉘이 수행할 확장이 없는 일반 문자열이기 때문에 아무 작업도 수행하지 않습니다(이것은 코드의 버그이므로 $outputfile
큰따옴표를 사용해야 할 수도 있습니다).
파일이 현재 디렉터리(그리고 그 디렉터리에만 있는 경우)에 있으면 다음을 수행할 수 있습니다.
for fasta in ./*.fna; do
barrnap --outseq "${fasta%.fna}.rrna" "$fasta"
done
또는 중간 변수를 사용하세요.
for fasta in ./*.fna; do
outfile="${fasta%.fna}.rrna"
barrnap --outseq "$outfile" "$fasta"
done
여기서는 작은따옴표 대신 큰따옴표를 사용합니다.생각하다쉘은 확장을 실행합니다. 또한 입력 파일 이름을 호출에서 명령줄 끝으로 옮겼습니다. barrnap
입력 파일 이름도 호출로 옮겼습니다.수동.
파일이 현재 디렉터리 내의 여러 하위 디렉터리에 있고 이를 사용해야 하는 find
경우 출력을 반복하는 대신 프로그램을 호출해 find
보겠습니다 .find
find . -type f -name '*.fna' -exec sh -c '
for fasta do
barrnap --outseq "${fasta%.fna}.rrna" "$fasta"
done' sh {} +
여기서는 find
쉘 루프에 대한 경로 이름 생성기처럼 작동합니다.
관련된:
=
. 를 할당할 때 주위에 공백이 없어야 하기 때문에 코드에 일부 구문 오류가 있습니다. 또한 변수 확장은 큰따옴표로 묶어야 합니다.