From 36b1973b672029dbb51c14fdd3e99d485f326e0a Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Fri, 11 Jun 2004 20:58:40 +0000 Subject: [PATCH] Se agrega una utilidad simple para sacar estadisticas de archivos de texto, para ver que caracteres aparecen mas. Modo de uso: ./cs.sh < [archivo] --- util/Makefile | 74 +++++++++++++++++++++++++++++++++++++++++++++++ util/charstat.cpp | 53 +++++++++++++++++++++++++++++++++ util/cs.sh | 2 ++ 3 files changed, 129 insertions(+) create mode 100644 util/Makefile create mode 100644 util/charstat.cpp create mode 100755 util/cs.sh diff --git a/util/Makefile b/util/Makefile new file mode 100644 index 0000000..46147dc --- /dev/null +++ b/util/Makefile @@ -0,0 +1,74 @@ +# Makefile de ejemplo para C++ +# +# Creado: jue abr 15 15:34:19 ART 2004 +# +# Copyleft 2004 - Leandro Lucarella, Bajo licencia GPL [http://www.gnu.org/] +# + +# CONFIGURACION +################ + +# Nombre del ejecutable. +target = charstat + +# Extensión de los archivos a compilar (c para C, cpp o cc o cxx para C++). +extension = cpp + +# Archivos con el código fuente que componen el ejecutable. Si no se especifica, +# toma todos los archivos con la extensión mencionada. Para especificar hay que +# descomentar la línea (quitarle el '#' del principio). +# NOTA: No poner cabeceras (.h). +#fuentes = entrada.cpp + +# Si es un programa GTK+, descomentá (quitale el '#' a) la siguiente línea. +#gtk = si + + +# CONFIGURACION "AVANZADA" +########################### + +# Opciones para el compilador C. +#CFLAGS = -Wall -ggdb -ansi -pedantic -DDEBUG +CFLAGS = -Wall -O3 -ansi -pedantic -DNDEBUG + +# Opciones para el compilador C++. +#CXXFLAGS = $(CFLAGS) -fno-inline +CXXFLAGS = $(CFLAGS) + + +# VARIABLES CALCULADAS A PARTIR DE LA CONFIGURACION +#################################################### + +# Agrego flags y libs de GTK+ de ser necesario. +ifdef gtk +CFLAGS += $(shell pkg-config --cflags gtk+-2.0) +CXXFLAGS += $(shell pkg-config --cflags gtk+-2.0) +LDFLAGS += $(shell pkg-config --libs gtk+-2.0) +endif + +# Uso enlazador de c++ si es código no C. +ifeq ($(extension), c) +enlazador = $(CC) +else +enlazador = $(CXX) +endif + +# Si no especifica archivos, tomo todos. +fuentes ?= $(wildcard *.$(extension)) + + +# REGLAS +######### + +.PHONY: all clean + +all: $(target) + +o_files = $(patsubst %.$(extension),%.o,$(fuentes)) + +$(target): $(o_files) + $(enlazador) $(LDFLAGS) $(o_files) $(LOADLIBES) $(LDLIBS) -o $(target) + +clean: + @$(RM) -fv *.o $(target) + diff --git a/util/charstat.cpp b/util/charstat.cpp new file mode 100644 index 0000000..369cffe --- /dev/null +++ b/util/charstat.cpp @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +typedef std::map< char, unsigned > freq_type; + +class print: public std::unary_function< freq_type::value_type, void > +{ + std::ostream& os; +public: + unsigned total; + print(std::ostream& out, unsigned total) : os(out), total(total) {} + void operator() (const freq_type::value_type& p) + { + os.fill('0'); + os.width(8); + os << p.second << ": "; + os.width(4); + os.fill(' '); + if (isgraph(p.first)) { + os << p.first; + } else { + std::ostringstream oss; + oss << "0x"; + oss.width(2); + oss.fill('0'); + oss.setf(std::ios::hex, std::ios::basefield); + oss << int(p.first); + os << oss.str(); + } + os << " (" << double(p.second) / total * 100 << "%)\n"; + } +}; + +int main(void) +{ + std::setlocale(LC_ALL, "es_AR"); + char c = 0; + unsigned total = 0; + std::map< char, unsigned > freq; + while (std::cin.get(c)) { + ++freq[c]; + ++total; + } + for_each(freq.begin(), freq.end(), print(std::cout, total)); + return 0; +} + diff --git a/util/cs.sh b/util/cs.sh new file mode 100755 index 0000000..6dbd66b --- /dev/null +++ b/util/cs.sh @@ -0,0 +1,2 @@ +#!/bin/sh +./charstat | sort -r -- 2.43.0