루프의 인수로 awk 출력 파이프

루프의 인수로 awk 출력 파이프

내가 사용하고 있는 두 번째 프로그램의 매개변수에서 출력을 구문 분석하고 사용하는 데 필요한 몇 가지 파일이 있습니다.

for file in ./*.vcf.gz; do
        echo "gunzip -c ${file} | awk 'BEGIN{FS=OFS=\"\t\"} NR == FNR{key[\$1]=\$2; next} \$1 in key{\$1=key[\$1]} 1' ./map | cut -f1-6 | sed '1,6d' | vep -i -o ./"${file}"_dnds --compress_output gzip --dir_cache ./" 
done

하지만 awk 명령이 있는 곳에 해당합니다.

gunzip -c ${file} | awk 'BEGIN{FS=OFS=\"\t\"} NR == FNR{key[\$1]=\$2; next} \$1 in key{\$1=key[\$1]} 1' ./map input

그런 다음 vep 프로그램에 들어가는 마지막 파이프 패스의 경우 다음과 같이 출력이 -i 입력으로 들어가도록 만드는 방법도 모르겠습니다.

vep -i input -o ./"${file}"_dnds --compress_output gzip --dir_cache ./"

이것은 거대한 텍스트 파일입니다. 임시 파일을 읽지 않고 어떻게 이 작업을 수행할 수 있습니까?

답변1

EnsEMBL의 변형 효과 예측기는 기본적으로 표준 입력(여기 문서).

즉, -i이 옵션(및 해당 옵션 인수)을 완전히 생략하면 파이프에서 입력을 읽게 됩니다.

파이프라인에서 무엇을 하려는지 잘 모르겠지만, 별도의 파일에서 읽어 특정 식별자를 다른 식별자로 바꾸려고 하는 것 같습니다. 이렇게 하면 awk쓸모없는 백슬래시가 있는 프로그램을 사용하는 것입니다. 명령 awk은 다음과 같이 작성할 수 있습니다.

awk 'BEGIN { FS=OFS="\t" } NR == FNR { key[$1]=$2; next} ($1 in key) { $1=key[$1] } 1' map -

입력 -파일 이름 awk에 도달하면 표준 입력에서 읽습니다( 이름이 지정된 파일을 처리한 후 map).

awk파이프라인이 제공하는 것보다 더 강력한 언어이며 쉽게 통합 cut하고 sed코딩할 수 있습니다.

awk 'BEGIN { FS=OFS="\t" } NR == FNR { key[$1]=$2; next} ($1 in key) { $1=key[$1] } FNR > 6 { print $1, $2, $3, $4, $5, $6 }' map -

귀하의 스크립트는 다음과 같습니다

#!/bin/sh

for file in ./*.vcf.gz; do
    gzip -cd "$file" |
    awk 'BEGIN { FS=OFS="\t" } NR == FNR { key[$1]=$2; next} ($1 in key) { $1=key[$1] } FNR > 6 { print $1, $2, $3, $4, $5, $6 }' map - |
    vep -o "${file}_dnds" --compress_output gzip --dir_cache ./ 
done

(변수 확장에 대한 올바른 큰따옴표도 참고하세요)

.vcf.gz출력 파일 끝에 파일 이름 접미사를 추가하기 전에 출력 파일 이름에서 파일 이름 접미사를 제거 하려면 ._dndsvep -o "${file%.vcf.gz}_dnds" ...

답변2

방금 awk가 stdin을 일반 파일로 처리하도록 함으로써 문제의 첫 번째 부분이 해결되었다는 것을 알았습니다.

gunzip -c ${file} | awk 'BEGIN{FS=OFS=\"\t\"} NR == FNR{key[\$1]=\$2; next} \$1 in key{\$1=key[\$1]} 1' ./map -

하지만 여전히 구문 분석된 출력을 파이프라인으로 연결하는 방법을 모릅니다.

vep -i input -o ./"${file}"_dnds --compress_output gzip --dir_cache ./

관련 정보