파일의 한 줄에서 특정 문자(".")의 최대 수를 찾는 Bash 스크립트

파일의 한 줄에서 특정 문자(".")의 최대 수를 찾는 Bash 스크립트

행 수를 알 수 없는 파일이 있습니다. 파일의 각 줄에는 알 수 없는 수의 마침표( .)가 포함되어 있습니다.

최대 기간 수를 찾는 방법은 무엇입니까? 그래요아니요가장 많은 마침표가 포함된 행을 찾는 데 관심이 있습니다.

예를 들어, bash에서 다음 파일 내용을 처리하면 "4"라는 대답이 제공되어야 합니다.

one.one
two.two.two
three.three.three.three
four..four.
five..five..
six...six

답변1

당신은 이것을 할 수 있습니다 awk:

awk '{gsub(/[^.]/,""); len=length(); if (len>max) {max=len}} END{printf("Largest count of \".\": %d\n",max)}' file.txt

각 줄의 모든 문자가 대체됩니다.아니요 ., "없음"(즉, 아닌 모든 것을 제거합니다 .). 그런 다음 나머지 문자열의 길이를 계산하고 에 있는 최대값을 저장합니다 max. 파일 끝에서 결과가 인쇄됩니다.

답변2

또는 특정 문자 수를 세고 줄 자체를 인쇄하거나 다른 문자를 세는 등의 추가 처리를 위해 텍스트를 변경하지 않고 그대로 둘 수 있습니다. gsub는 대체 횟수를 반환합니다.

awk '{ nDot = gsub ("[.]", "."); etc .. }'

답변3

awk 없이 답변:

sed 's/[^.]//g' test.dat | wc -L

즉, 포인트만 유지하고 -L 옵션을 사용합니다 wc.-L, --max-line-length: print the maximum display width

답변4

한 가지 접근 방식 awk은 다음과 같습니다. 우리는 다음 방정식이 성립한다는 것을 깨달아야 합니다.

  • number of fields = number of delimiters + 1

산술 비교에서 피연산자에 a를 추가하는 것은 0항상 필요한 것은 아니지만 심어줄 만한 좋은 습관입니다. 적어도 자동 반사 코딩 동작이 되기 때문에 생각하는 데 도움이 됩니다. 산술 및 문자열 비교를 위한 별도의 연산자가 제공되지 않으므로 Awk문자열을 수학적 피연산자 또는 오히려 컨텍스트와 명확하게 구분하는 데 도움이 되는 강제 변환이 필요합니다.

$ awk -F '[.]' '
    NF>m+0 {m=NF}
    END {print --m}
' file
4
$ awk '
    gsub(/[^.]+/, "") &&
    ! index(t, $0) { t = $0 }
    END { print length(t) }
' file
$ perl -lne '
    my $k = tr/.//;
    $k > $m and $m = $k;
    }{ print $m+0;
' file

편집기 GNU sed는 이진 계산기 유틸리티와 함께 ​​사용할 수도 있습니다 bc. 아이디어는 모든 비점에서 선을 제거하고 현재 가장 긴 순수 점 문자열을 유지하는 것입니다. 에서는 eof이러한 포인트를 실행 가능한 코드로 변환하여 bc이러한 포인트의 수량을 생성합니다.

$ sed -Ee '
    s/[^.]+//g;G
    /^(.*)..*\n\1$/!ba
    s/\n.*//;h;:a
    $!d;g;s/./1+/g;s/$/0/
'  file | bc -l

관련 정보