87 votes

Compter la longueur des lignes d'un fichier à l'aide d'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 :

file.txt

this
is
a
sample
file
with
several
lines
of
varying
length

Running count_line_lengths file.txt donnerait :

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

Des idées ?

117voto

Ignacio Vazquez-Abrams Points 312628

Ce site

  • compte les longueurs de ligne en utilisant awk alors
  • trie les longueurs de lignes (numériques) en utilisant la méthode suivante sort -n et enfin
  • compte les valeurs uniques de longueur de ligne uniq -c .

    $ awk '{print length}' input.txt | sort -n | uniq -c 1 1 2 2 3 4 1 5 2 6 2 7

Dans la sortie, la première colonne est le nombre de lignes avec la longueur donnée, et la deuxième colonne est la longueur de la ligne.

29voto

1_CR Points 11848

L'awk pur

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

12voto

Adrian Frühwirth Points 8883

Utilisation de bash les tableaux :

#!/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

8voto

J.F. Sebastian Points 102961
$ 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

1voto

Maksym Ganenko Points 11

Vous pouvez y parvenir en utilisant uniquement les utilitaires Unix de base :

$ printf "%s %s\\n" $(for line in $(cat file.txt); do 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 cela fonctionne-t-il ?

  1. Voici le fichier source : $ cat file.txt this is a sample file with several lines of varying length

  2. Remplacer chaque ligne du fichier source par sa longueur : $ for line in $(cat file.txt); do printf $line | wc -c; done 4 2 1 6 4 4 7 5 2 7 6

  3. Trier et compter le nombre d'occurrences de la longueur : $ for line in $(cat file.txt); do printf $line | wc -c; done | sort -n | uniq -c 1 1 2 2 3 4 1 5 2 6 2 7

  4. Échanger et formater les chiffres : $ printf "%s %s\n" $(for line in $(cat file.txt); do 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X