파일 이름을 명령줄에 인수로 전달할 때마다 파일 이름의 awk/sed 접두사를 사용하고 싶습니다.
예를 들어,
파일이 여러 개 있습니다.
a.fastq.gz
b.fastq.gz
c.fastq.gz
d.fastq.gz
내가 실행하는 경우:
sh test.sh --INFILE b.fastq.gz
내가 원하는 출력은 다음과 같습니다.
b
제가 시도했지만 실패한 것은,
prefix="sed 's/.fastq//' ${INFILE}"
답변1
셸 인수 확장을 사용합니다(파일 이름을 에 할당한다고 가정 INFILE
).
INFILE=b.fastq.gz
prefix=${INFILE%%.*}
또는 접미사가 확실히 고정되어 있고 더 정확하고 싶다면 (가능한 경우 항상 권장됩니다):
prefix=${INFILE%.fastq.gz}
${parameter%word}
${parameter%%word}
단어가 확장되어 패턴을 생성하고 아래 설명된 규칙에 따라 일치됩니다(패턴 일치 참조). 패턴이 일치하는 경우 패턴이 매개변수 확장 값의 후행 부분과 일치하는 경우 확장 결과는 가장 짧은 일치 패턴('%' 케이스) 또는 가장 긴 일치 패턴('%' 케이스)이 제거된 매개변수 값입니다. 매개변수가 "@" 또는 "인 경우'를 사용하면 각 위치 인수에 패턴 제거 작업이 차례로 적용되고 확장이 결과 목록이 됩니다. 매개 변수가 배열 변수인 경우 아래 첨자는 "@" 또는 "'를 실행하면 배열의 각 멤버에 패턴 삭제 작업이 차례로 적용되고 확장이 결과 목록이 됩니다.
답변2
표준 basename
유틸리티를 사용하여 알려진 접미사를 제거합니다.
$ basename b.fastq.gz .fastq.gz
b
변수 사용:
$ pathname="/some/path/name.fastq.gz"
$ basename "$pathname" .fastq.gz
name
변수에 할당:
$ prefix=$( basename "$pathname" .fastq.gz )
$ printf 'Prefix is "%s"\n' "$prefix"
Prefix is "name"
루프에서( .fastq.gz
현재 디렉터리의 모든 파일을 반복):
for filename in ./*.fastq.gz; do
prefix=$( basename "$filename" .fastq.gz )
# Do things using "$prefix" here
done
답변3
단계별로 시도한 내용을 수정하여 현재 수행 중인 작업을 확인하겠습니다.
$ INFILE=b.fastq.gz; prefix="sed 's/.fastq//' ${INFILE}"; echo "$prefix"
sed 's/.fastq//' b.fastq.gz
$ INFILE=b.fastq.gz; prefix="$(sed 's/.fastq//' ${INFILE})"; echo "$prefix"
sed: can't read b.fastq.gz: No such file or directory
$ INFILE=b.fastq.gz; prefix="$(sed 's/.fastq//' <<< ${INFILE})"; echo "$prefix"
b.gz
$ INFILE=b.fastq.gz; prefix="$(sed 's/\.fastq.*//' <<< ${INFILE})"; echo "$prefix"
b