ファイルの 1 行で特定の文字 (".") の最大数を検索する Bash スクリプト

ファイルの 1 行で特定の文字 (".") の最大数を検索する 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

1つのアプローチ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

関連情報