내가 사용하고 있는 두 번째 프로그램의 매개변수에서 출력을 구문 분석하고 사용하는 데 필요한 몇 가지 파일이 있습니다.
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
출력 파일 끝에 파일 이름 접미사를 추가하기 전에 출력 파일 이름에서 파일 이름 접미사를 제거 하려면 ._dnds
vep -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 ./