행 수를 알 수 없는 파일이 있습니다. 파일의 각 줄에는 알 수 없는 수의 마침표( .
)가 포함되어 있습니다.
최대 기간 수를 찾는 방법은 무엇입니까? 그래요아니요가장 많은 마침표가 포함된 행을 찾는 데 관심이 있습니다.
예를 들어, 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