awk/sed 파일 이름의 일부

awk/sed 파일 이름의 일부

파일 이름을 명령줄에 인수로 전달할 때마다 파일 이름의 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

관련 정보