awk를 사용하여 #으로 시작하지 않는 여러 파일의 줄 수를 계산하고 파일 이름별로 나열하려면 어떻게 해야 합니까?

awk를 사용하여 #으로 시작하지 않는 여러 파일의 줄 수를 계산하고 파일 이름별로 나열하려면 어떻게 해야 합니까?

grep "^[^#]" file.txt | wc -l나는 그것을 단일 파일의 줄 수를 계산하는 데 사용했습니다 .

awk다음으로 시작하지 않는 줄 수를 어떻게 계산 #하고 이와 같이 파일 이름을 인쇄할 수 있습니까?

file1.txt 30 
file2.txt 33
....

답변1

다음 방법으로 이 작업을 수행할 수도 있습니다 grep.

grep -c "^[^#]" *

또는

grep -cv "^#" *

전자는 빈 줄도 제외합니다. 후자는 그렇지 않습니다.

현재 디렉터리에 단일 파일이 있으면 파일 이름이 표시되지 않습니다. grep일부 버전(GNU 포함)에서는 다음 옵션을 추가하여 이를 방지할 수 있습니다.grep-H

grep -cvH "^#" *

GNU는 grep또한 다음과 같은 내림차순 디렉터리 트리의 재귀 검색을 지원합니다.

grep -rcvH "^#" .

출력이 요구 사항과 일치하지 않아 다음과 같이 표시됩니다.

file1.txt:30
file2.txt:33

하지만 이 문제는 출력을 파이핑하여 해결할 수 있습니다 sed 's/:\([^:]*\)$/ \1/'.

답변2

수행할 수 있는 작업은 다음과 같습니다 awk( awk에도 동일하게 ^[^#]적용되지만 정규식 일치에서 슬래시 쌍 안에 작성됩니다 (다른 방법도 있음)).grepawk/.../

find . -type f -exec \
    awk '/^[^#]/ {count++}; END{ print FILENAME, count+0 }' {} \;

또는 GNU awk가 있는 경우ENDFILE{}막힘:

gawk '/^[^#]/{ count++ }; ENDFILE{ print FILENAME, count+0; count=0 }' ./multiple.files*

또는 재귀적으로:

find . -type f -exec \
    gawk '/^[^#]/{ count++ }; ENDFILE{ print FILENAME, count+0; count=0 }' {} +
노트:
  • 를 사용하면 /^[^#]/빈 줄 계산을 건너뜁니다. _
  • 을 사용하는 것은 입력에 빈 줄이 없는 경우에만 조건부와 동일합니다 !/^#/. 그렇지 않으면 빈 줄도 계산됩니다. 이것이 실제로 수행되는 작업이며 요청할 때 더 정확합니다./^[^#]/!/^#/"#으로 시작하지 않는 줄 계산"
  • !/^#/정확히 동일합니다 /^([^#]|$)/(따라서 둘 다 빈 줄도 계산합니다)

위의 사항을 고려하여 "#으로 시작하지 않는 줄 계산"과 같이 빈 줄도 계산하려면 다음을 수행하십시오.

awk '!/^#/{count++} END{ print FILENAME, count+0 }'

또는 그에 상응하는 것:

awk '/^([^#]|$)/{count++} END{ print FILENAME, count+0 }'

또는 (권장@에드모턴):

awk '/^#/{ count++ } END{ print FILENAME, FNR-count }'

그리고 GNU awk 형식에도 동일한 접근 방식을 적용합니다.

awk '/^#/{ count++ } ENDFILE{ print FILENAME, FNR-count; count=0 }'

파일이 주석 줄로 가득 차 있을 때 인쇄 출력을 건너뛰려면 다음을 수행하십시오.

awk '/^#/{ count++ } END{ if(count) print FILENAME, FNR-count }'

답변3

for i in  *
do
if [[ -f "$i" ]]
then
co=$(grep -vc "^#"  "$i" )
echo "$i $co"
fi
done

답변4

그리고perl

find . -type f -exec perl -lnse '
  /^#/ || $c++;
  eof  && (print($ARGV,$c),$c=0);
' -- -,=: {} +

POSIXly를 사용하십시오 awk.

find . -type f -exec awk -v OFS=: '
FNR==1 && NR>1 {
  print prev, knt+0
  knt=0
}
substr($0,1,1) != "#"{knt++}
FILENAME != prev {prev=FILENAME}
END { print prev, knt+0 }
' {} +

관련 정보