web-dev-qa-db-fra.com

Comment imprimer le nombre de caractères dans chaque ligne d'un fichier texte

Je voudrais imprimer le nombre de caractères dans chaque ligne d'un fichier texte en utilisant une commande unix. Je sais que c'est simple avec Powershell

gc abc.txt | % {$_.length}

mais j'ai besoin de la commande unix.

61
vikas368

Utilisez Awk.

awk '{ print length }' abc.txt
120
Fred Foo
while read -r line; do echo ${#line}; done < abc.txt

C'est POSIX, donc ça devrait marcher partout.

Edit: Ajouté -r comme suggéré par William.

Edit: Méfiez-vous de la gestion Unicode. Bash et zsh, avec les paramètres régionaux correctement définis, indiqueront le nombre de points de code, mais dash affichera les octets. Vous devez donc vérifier ce que fait votre shell. Et puis, il existe de nombreuses autres définitions de longueur possibles dans Unicode, cela dépend donc de ce que vous voulez réellement.

13
Jan Hudec

Voici un exemple utilisant xargs:

$ xargs -d '\n' -I% sh -c 'echo % | wc -c' < file
2
kenorb

J'ai essayé les autres réponses énumérées ci-dessus, mais elles sont très loin d'être des solutions décentes lorsqu'il s'agit de gros fichiers, en particulier lorsque la taille d'une seule ligne occupe plus de 1/4 de la RAM disponible.

Les deux bash et awk slurp la ligne entière, même si pour ce problème ce n'est pas nécessaire. Bash se trompera si une ligne est trop longue, même si vous avez assez de mémoire.

J'ai implémenté un script extrêmement simple et relativement non optimisé python) qui, lorsqu'il est testé avec des fichiers volumineux (environ 4 Go par ligne), ne produit pas de slurp et constitue de loin une meilleure solution.

S'il s'agit d'un code critique pour la production, vous pouvez réécrire les idées en C ou effectuer de meilleures optimisations sur l'appel de lecture (au lieu de lire uniquement un octet à la fois), après avoir vérifié qu'il s'agit bien d'un goulot d'étranglement.

Le code suppose que newline est un caractère de saut de ligne, ce qui est une bonne hypothèse pour Unix, mais YMMV sous Mac OS/Windows. Assurez-vous que le fichier se termine par un saut de ligne afin d’assurer que le nombre de caractères de la dernière ligne n’est pas oublié.

from sys import stdin, exit

counter = 0
while True:
    byte = stdin.buffer.read(1)
    counter += 1
    if not byte:
        exit()
    if byte == b'\x0a':
        print(counter-1)
        counter = 0
2
user2875414

Essaye ça:

while read line    
do    
    echo -e |wc -m      
done <abc.txt    
0
Rahul