Honestamente, a maneira mais fácil é usar awk :
awk -F'\t' '{print NF-1}' foo
NF é o número de campos, -F'\t' informa awk para dividir campos nas guias, portanto, o número de guias será um a menos que o número de campos, e é por isso que temos awk print NF-1 .
Se você realmente não quer usar awk você poderia fazer ( nota: isso não conta as abas finais no final de cada linha):
$ while read line; do echo "$line" | fold -1 | grep -c $'\t'; done < foo
2
4
0
1
0
Para lidar com guias iniciais e finais, bem como com outros caracteres estranhos (como barras invertidas), faça isso:
$ while IFS= read line; do echo "$line" | fold -1 | grep -c $'\t'; done < foo
-
while read lines; do ... ; done < foo : leia cada linha do arquivo foo na variável $line .
-
echo "$line" | fold -1 : o comando fold irá imprimir um caractere por linha
-
grep -c $'\t' : isso é executado em cada linha do arquivo ( $line ), mas desde
$line foi dobrado em um caractere por linha, grep -c contará o número de guias nessa linha. Se você não for fold , grep -c contará o número de linhas correspondentes e não fornecerá uma linha de contagem de guias por .
Você também pode usar o Perl, mas acho que não está disponível também. Aqui está um caminho, independentemente:
perl -lne '@a=/\t/g;print scalar @a' foo