길이 조건을 사용하여 행 수 계산

길이 조건을 사용하여 행 수 계산

줄 길이가 300자 미만인 대용량 파일의 줄 수를 계산하려고 합니다.

현재 접근 방식은 다음 명령을 사용하는 것입니다(그러나 매우 느립니다).

awk "length<=300" *.log | wc -l

행 수만 얻는 더 좋은 방법이 있습니까?

답변1

awk행 수를 계산 하는 데 사용됩니다.

awk 'length<=300{c++} END { print c }' *.log

어디

  • c++증분 카운터
  • END { print c }마지막 줄 이후에 실행되어 값을 인쇄합니다 c.

확실하지 않습니다. 이것이 더 빠를 것입니다(적어도 wc -l행을 계산하고 구문 분석할 필요가 없습니다).


소계 가져오기(1행일 수 있음)

awk 'length<=300{t++;s++} 
     ENDFILE { printf "%s:%d\n",FILENAME,s ; s=0 ; } 
     END { printf "TOTAL:%d\n",t }' *.log

답변2

그리고 grep:

cat *.log | grep -vc '^.\{301\}'

길이에 따라 줄을 일치시키려면 검색 패턴이 한 줄로 제한되므로 모든 문자에 대해 grep(역방향 일치)을 <=300수행합니다 . 패턴은 줄의 시작 부분에 고정됩니다 . 일치하는 행의 수를 계산합니다 .-v301grep^-c


기본적인 진행률 표시기를 원하면 다음 pv패키지를 사용할 수 있습니다 moreutils.

pv *.log | grep -vc '^.\{301\}'

각 파일의 줄 번호를 얻으려면 다음을 수행하십시오.

grep -vc '^.\{301\}' *.log

위 명령에서 총 수를 얻으려면 다음을 수행하십시오.

grep -vc '^.\{301\}' *.log | awk -F':' '{c+=$NF} END {print c}'

grep데이터에 따라 일반적으로 파이프를 사용 하지 않지만 매우 긴 입력 줄이 많은 경우 &보다 빠를 awk수 있습니다 . 여기서 파이프는 소량의 데이터, 숫자 및 파일 이름에만 사용됩니다.catgrep

답변3

사용행복하다(이전 Perl_6)

쉘 와일드카드에 따라 다릅니다.

raku -ne 'state $i; $i++ if .chars <= 300; END say $i // 0;'

#OR

raku -ne 'state $i; if .chars <= 300 {$i++}; END say $i // 0;'

정규식으로 결정되는 파일(셸 와일드카드와 무관):

raku -e 'for dir(test => / .+ \.log $ /) {state $i; $i++ if .chars <= 300 for .lines; END say $i // 0};'

https://docs.raku.org/syntax/state
https://docs.raku.org/routine/dir
https://raku.org

관련 정보