BASHのマニュアルページで定義されているように、文字CLASSでランダムファイル内のすべての文字を効率的に計算する必要があります。
[[:alnum:]], [[:alpha:]], [[:ascii:]], [[:blank:]], [[:cntrl:]], [[:digit:]], [[ :図:]]、[[:下部:]]、[[:印刷:]]、[[:punct:]]、[[:Space:]]、[[:上部:]]、[[:Word :]]と[[:xdigit:]]
ファイルを処理した後、各結果の数がゼロであっても1行に表示されます。
インターネット検索では、同様のコンテンツを見つけることができませんでした。
任意のファイル(/tmp/f1.txt
)にはさまざまなテキスト/データが含まれます。
私はELFバイナリやUnicode(またはあらゆる形式のマルチバイト)コンテンツを扱いたくありません。
CR
行数(および/または)は気にせず、上記のクラスを介して累積されたターゲットファイル内LF
の各「文字」の数だけを気にします。
function()
私はこれが最終的に大きなbashスクリプト間の標準になることを意図しています。 bash/sed/awkなどが必要です。 Perl/python/rubyはあまり必要ありません。
サンプルデータファイルは次のとおりです。
0バイト、つまりコンテンツはまったくありません。
単一文字
言葉
複数の単語をスペースで区切ります。
複数行には、スペースおよび/またはキャリッジリターンおよび/または改行が含まれています。
複数行ファイルの場合、最後の行の終わりを示すか、またはがない可能性が
CR
あります(ただし、すべての文字はまだ計算する必要があります)。LF
ベストアンサー1
file=myfile
for class in alnum alpha blank cntrl digit graph lower print punct space upper xdigit
do
printf '%7s: %d\n' "$class" "$(tr -Cd "[:${class}:]" < "$file" | wc -m)"
done
ascii
word
標準文字クラスではなく、具体的ですbash
。下線が引かれword
て文字 0~127 なので、次のようにできます。alnum
ascii
printf '%7s: %d\n' word "$(tr -Cd "_[:alnum:]" < "$file" | wc -m)"
printf '%7s: %d\n' ascii "$(LC_ALL=C tr -cd '\0-\177' < "$file" | wc -c)"
(coreutils-8.22以降、GNU実装はtr
マルチバイト文字と連携できません。)
少なくとも GNU libc を使用するシステムでは、以下を実行することもできます。
$ locale ctype-class-names
upper;lower;alpha;digit;xdigit;space;print;graph;blank;cntrl;punct;alnum;combining;combining_level3
そのロケールで定義されている文字クラスのリストを見つけます。