Compter les longueurs de lignes dans un fichier à l’aide des outils de ligne de commande

Problème

Si j’ai un long fichier 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 

Exécuter count_line_lengths file.txt donnerait:

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

Des idées?

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 

Pure 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 

Utiliser des 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 
 $ 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 

Vous pouvez accomplir cela en utilisant uniquement des utilitaires Unix de base:

  $ printf "% s% s \ n" $ (pour la ligne dans $ (cat file.txt); 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 file.txt
     ce
     est
     une
     échantillon
     fichier
     avec
     nombreuses
     lignes
     de
     variant
     longueur
    
  2. Remplacez chaque ligne du fichier source par sa longueur:
      $ pour la ligne dans $ ( cat file.txt );  do printf $ line |  wc-c;  terminé
     4
     2
     1
     6
     4
     4
     7
     5
     2
     7
     6
    
  3. Trier et compter le nombre d’occurrences de longueur:
      $ pour la ligne dans $ (cat file.txt);  do printf $ line |  wc-c;  fait |  sort -n |  uniq -c
           1 1
           2 2
           3 4
           1 5
           2 6
           2 7
    
  4. Échangez et formatez les nombres:
      $ printf "% s% s \ n" $ ( pour la ligne dans $ (cat file.txt); 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