Una posible solución utilizando perl
:
contenido de script.pl:
use warnings;
use strict;
## Check arguments:
## 1.- Input file
## 2.- Char to search.
## 3.- (Optional) field to search. If blank, zero or bigger than number
## of columns, default to search char in all the line.
(@ARGV == 2 || @ARGV == 3) or die qq(Usage: perl $0 input-file char [column]\n);
my ($char,$column);
## Get values or arguments.
if (@ARGV == 3) {
($char, $column) = splice @ARGV, -2;
} else {
$char = pop @ARGV;
$column = 0;
}
## Check that $char must be a non-white space character and $column
## only accept numbers.
die qq[Bad input\n] if $char !~ m/^\S$/ or $column !~ m/^\d+$/;
print qq[count\tlineNum\n];
while (<>) {
## Remove last '\n'
chomp;
## Get fields.
my @f = split /\|/;
## If column is a valid one, select it to the search.
if ($column > 0 and $column <= scalar @f) {
$_ = $f[ $column - 1];
}
## Count.
my $count = eval qq[tr/$char/$char/];
## Print result.
printf qq[%d\t%d\n], $count, $.;
}
El script acepta tres parámetros:
- archivos de entrada
- Char a búsqueda
- Columna a buscar: si la columna es un dígito malo, busca toda la línea.
Ejecución del script sin argumentos:
perl script.pl
Usage: perl script.pl input-file char [column]
Con argumentos y su salida:
Aquí 0 es un mal columna, se busca en toda la línea.
perl script.pl stores.dat 't' 0
count lineNum
4 1
3 2
6 3
Aquí búsquedas en la columna 1.
perl script.pl stores.dat 't' 1
count lineNum
0 1
2 2
0 3
Aquí se busca en la columna 3.
perl script.pl stores.dat 't' 3
count lineNum
2 1
1 2
4 3
th
no es un char.
perl script.pl stores.dat 'th' 3
Bad input
echa un vistazo a http://www.gnu.org/software/gawk/manual/gawk.html es una herramienta de Unix muy poderosa – Chris
http://unix.stackexchange.com/questions/18736/how-to -count-the-number-of-a-specific-character-in-each-line –