grep -v 문제는 1000개가 넘는 파일의 줄 수(한 줄 수)를 가져옵니다.

grep -v 문제는 1000개가 넘는 파일의 줄 수(한 줄 수)를 가져옵니다.

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 파일이 없을 때 오류를 방지합니다( -rwith N)).

관련 정보