VCF 파일에 이 명령을 사용해야 합니다.
grep -v "#" {name of VCF file} | wc -l
이것은 "#"이 없는 행 수를 제공합니다.
하지만 내 문제는 내 디렉토리에 많은 파일이 있고 개별 줄 수가 필요하다는 것입니다. 따라서 "#"이 없는 각 파일의 줄 수가 필요합니다.
내가 할 때: grep -v "#" *.vcf* | wc -l
파이프는 # 없이 모든 파일의 줄을 합산합니다. 각 파일의 줄 수를 개별적으로 알아야 합니다. 각 파일의 행을 수동으로 파이프할 수는 없습니다(파일이 천 개가 넘습니다). 누구든지 각 파일의 줄 수를 얻는 방법을 제안할 수 있습니까? 미리 감사드립니다!
답변1
grep -c
파이프 대신 사용하십시오 wc -l
.
grep -c -v -- '#' *.vcf
현재 디렉터리에 vcf 파일이 하나만 있는 경우 해당 이름은 출력되지 않고 개수만 가져옵니다.
grep
이 문제를 해결하려면 GNU 구현이나 호환성을 통해 이 -H
옵션을 추가하면 됩니다.
grep -Hcv -- '#' *.vcf
/dev/null
다른 구현의 경우 언제든지 목록에 추가 하고 tail -n +2
파이프를 통해 제거할 수 있습니다.
grep -c -v -- '#' /dev/null *.vcf | tail -n +2
( 지원되는 쉘 옵션을 설정하지 않으면 grep
프로세스에서 종료 상태가 손실 되지만).pipefail
반면에 파일 이름 없이 각 개수만 필요한 경우에는 -h
대신 GNU를 사용 -H
하거나 지원되지 않는 구현이 포함된 루프를 사용하세요 grep
.grep
-h
for file in *.vcf; do grep -cv '#' < "$file"; done
또는 전체 종료 상태와 함께 실패를 보고합니다.
(
ret=0
for file in *.vcf; do
grep -cv '#' < "$file" || ret=$?
done
exit "$ret"
)
당신이 얻을 경우매개변수 목록이 너무 깁니다.grep
오류, 다음 도구를 사용하여 목록을 여러 호출로 분할할 수 있습니다 xargs
(여기에서는 GNU 도구로 가정).
printf '%s\0' *.vcf | xargs -r0 grep -cvH -- '#'
또는 zsh
함께 사용하는 경우 zargs
:
autoload zargs
zargs -r -- *.vcf(Nn.) -- grep -cvH -- '#'
(이것은 또한 glob 한정자 기능을 사용하여 일반 파일( .
)로 제한하고, 파일 목록에 숫자 정렬 순서를 사용하고( n
) vcf 파일이 없을 때 오류를 방지합니다( -r
with N
)).