여러 파일에 대해 grep 및 wc -l을 반복적으로 실행

여러 파일에 대해 grep 및 wc -l을 반복적으로 실행

fasta 파일이 여러 개 있고 ">"(따옴표 제외)로 시작하는 줄 수를 계산하고 싶습니다.

내가 평소에 하는 일은

grep ">" file.fasta | wc -l

이 시간은 하나의 파일에 적용됩니다. 나는 다음을 사용하여 다른 대안을 시도하고 있습니다.찾다명령을 실행했지만 아무것도 작동하지 않는 것 같습니다. 내가 원하는 마지막 것은 한 줄씩, 파일 이름을 지정하고 >로 시작하는 줄 수를 계산하는 것입니다. 이상적으로는 한 줄이어야 합니다.

답변1

grep플래그를 사용하여 계산할 수 있으므로 -c필요 wc -l하지 않습니다. 또한 grep여러 파일을 제공하는 경우 해당 파일이 입력으로 사용됩니다.

예를 들어,

grep -c '^>' some/dir/*.fa

이 작업을 재귀적으로 수행하려면 해당 옵션을 알고 있는 옵션이 grep -Rc '^>' dirname있는 경우 사용하십시오 (이것은 실행됩니다).grep-R모두파일), 그렇지 않으면 다음을 사용하십시오 find.

find dirname -type f \( -name '*.fa' -o -name '*.fasta' \) -exec grep -c '^>' /dev/null {} +

/dev/null위 명령의 추가 항목은 grep최소한 두 개의 입력 파일을 가져오도록 하고, 결과적으로 처리하는 파일의 이름을 항상 표시하도록 보장합니다(단일 입력 파일에 대해서는 이 작업을 수행하지 않음). 비표준 옵션이지만 와 -H함께 사용할 수도 있습니다 .grep

또는 경로 이름이 다음과 같은 루프에 원래 명령을 삽입하십시오 find.

find dirname -type f \( -name '*.fa' -o -name '*.fasta' \) -exec sh -c '
    for pathname do
        printf "Counting in %s...\n" "$pathname"
        grep "^>" "$pathname" | wc -l
    done' sh {} +

귀하의 명령 자체는 파일 이름을 보고하지 않으므로 printf이를 언급하는 설명을 추가했습니다.

관련된:

관련 정보