行数が不明なファイルがあります。ファイルの各行には、不明な数のピリオド(.
)が含まれています。
最大期間数を見つける方法は?はいいいえ最も多くのピリオドを含む行を見つけることに興味があります。
たとえば、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