web-dev-qa-db-fra.com

Compter les longueurs de ligne dans un fichier à l'aide d'outils de ligne de commande

Problème

Si j'ai un fichier long avec beaucoup de lignes de différentes longueurs, comment puis-je compter les occurrences de chaque longueur de ligne?

Exemple:

fichier.txt

this
is
a
sample
file
with
several
lines
of
varying
length

Fonctionnement count_line_lengths file.txt donnerait:

Length Occurences
1      1
2      2
4      3
5      1
6      2
7      2

Des idées?

60
Peter Hamilton

count.awk:

{
  print length($0);
}

...

$ awk -f count.awk input.txt | sort | uniq -c
      1 1
      2 2
      3 4
      1 5
      2 6
      2 7
87

Purement awk

awk '{++a[length()]} END{for (i in a) print i, a[i]}' file.txt

4 3
5 1
6 2
7 2
1 1
2 2
24
iruvar

Utiliser les tableaux bash:

#!/bin/bash

while read line; do
    ((histogram[${#line}]++))
done < file.txt

echo "Length Occurrence"
for length in "${!histogram[@]}"; do
    printf "%-6s %s\n" "${length}" "${histogram[$length]}"
done

Exemple d'exécution:

$ ./t.sh
Length Occurrence
1      1
2      2
4      3
5      1
6      2
7      2
10
$ Perl -lne '$c{length($_)}++ }{ print qq($_ $c{$_}) for (keys %c);' file.txt

sortie

6 2
1 1
4 3
7 2
2 2
5 1
7
jfs

Pour ce faire, utilisez uniquement les utilitaires Unix de base:

$ printf "% s% s\n" $ (pour la ligne dans $ (cat file.txt); ne printf $ line | wc -c; done | sort -n | uniq -c | sed -E "s/([ 0-9] +) [^ 0-9] + ([0-9] +)/\ 2\1 /")
 1 1 
 2 2 
 4 3 
 5 1 
 6 2 
 7 2 

Comment ça marche?

  1. Voici le fichier source:
    $ cat fichier.txt 
     ceci 
     est 
     un 
     échantillon 
     fichier 
     avec 
     plusieurs 
     lignes 
     de 
     de longueurs 
     
    
  2. Remplacez chaque ligne du fichier source par sa longueur:
    pour ligne en $ (cat fichier.txt) faire printf $ line | wc -c; terminé
     4 
     2 
     1 
     6 
     4 
     4 
     7 
     5 
     2 
     7 
     6 
    
  3. Triez et comptez le nombre d'occurrences de longueur:
    pour la ligne dans $ (cat file.txt); faire printf $ line | wc -c; terminé | trier -n | uniq -c
     1 1 
     2 2 
     3 4 
     1 5 
     2 6 
     2 7 
    
  4. Permutez et mettez en forme les nombres:
    printf "% s% s\n" $ (pour la ligne dans $ (cat file.txt); faire printf $ line | wc -c; fait | trier -n | uniq -c | sed -E "s/([0-9] +) [^ 0-9] + ([0-9] +)/\ 2\1 /") 
     1 1 
     2 2 
     4 3 
     5 1 
     6 2 
     7 2 
    
1
Maksym Ganenko