줄 길이가 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
수행합니다 . 패턴은 줄의 시작 부분에 고정됩니다 . 일치하는 행의 수를 계산합니다 .-v
301
grep
^
-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
수 있습니다 . 여기서 파이프는 소량의 데이터, 숫자 및 파일 이름에만 사용됩니다.cat
grep
답변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