파일 목록에서 스크립트 실행

파일 목록에서 스크립트 실행

.vcf 파일을 가져와서 파일을 구문 분석하고 .txt에 쓰는 스크립트가 있습니다.

grep -v "#" file.vcf | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' > vcf_output.txt

.vcf이 스크립트를 동시에 실행하고 해당 파일 이름 .vcf으로 각 파일의 출력을 작성하려는 27개의 파일이 있습니다..txt.vcf

Google에서 이것을 찾았지만 실행 후 아무 일도 일어나지 않았습니다

for f in *.vcf; do
    script "$f" > "${f%.*}.txt"
done

나는 아래와 같은 것을 사용했다.

for f in *.vcf; do

grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' "$f" > "${f%.*}.txt"
    done

나도 시도했다

(base) loan-mac-13:Pre_Treatment fi1d18$ find -type f -name "*.vcf" | xargs grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' "$f" > "${f%.*}.txt"
find: illegal option -- t
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
sed: : No such file or directory
(base) loan-mac-13:Pre_Treatment fi1d18$ 

나에게 도움이 되도록 어떻게 추진할 수 있나요?

답변1

script "$f"Google 출력을 쉘 루프 스크립트에서 (누락된)로 변환한 다음 grep -v "#"이를 사용하는 대신 스크립트의 잘못된 위치에서 사용하고 있습니다."$f""$f"{}xargs

어쨌든, awk를 사용하면 파이프라인에 sed와 grep이 많이 필요하지 않습니다. 입력/출력 예제를 제공하지 않았으므로 다음 awk 스크립트는 기존 파이프라인을 직접 변환한 것입니다. 더 나은 작성 방법이 있을 수 있지만 이 awk 스크립트가 필요한 것입니다. 쉘 루프나 기타 항목은 없습니다. :

awk '
    FNR == 1 {
        close(out)
        out = FILENAME
        sub(/\.vcf$/,".txt",out)
    }
    !/#/ {
        sub(/chrM/,"MT")
        sub(/chrX/,"X")
        sub(/chrY/,"Y")
        $0 = $1 OFS $2 OFS $2 OFS $4 "/" $5 OFS "+"
        gsub(/chr/,"")
        print > out
    }
' *.vcf

grep+seds+awk 파이프를 사용하는 것처럼 더 적은 줄로 작성하려면 각 줄 뒤를 제외하고 제거하려는 모든 줄 바꿈에 세미콜론을 사용할 수 있습니다. {예를 들면 다음과 같습니다.

awk 'FNR==1{close(out); out=FILENAME; sub(/\.vcf$/,".txt",out)} !/#/{sub(/chrM/,"MT"); sub(/chrX/,"X"); sub(/chrY/,"Y"); $0=$1 OFS $2 OFS $2 OFS $4 "/" $5 OFS "+"; gsub(/chr/,""); print > out}' *.vcf

답변2

find 및 xargs를 사용하여 이를 수행할 수 있습니다.

찾기는 모든 파일을 나열합니다.

find -type f -name "*.vcf"

xargs를 사용하면 발견된 모든 파일에 대해 작업을 수행할 수 있습니다.

find -type f -name "*.vcf" | xargs grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' "$f" > "${f%.*}.txt"

내가 이 일을 해야 하나?

인사

답변3

다음은 프로세스를 변경하지 않고도 작동해야 합니다. 파이프라인의 첫 번째 명령인 grep에는 아무 것도 입력하지 않았습니다. 그래서 아무것도 움직이지 않았습니다.

for f in *.vcf; do

< "$f"  grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g'  > "${f%.*}.txt"
    done

관련 정보