Comment obtenir le nombre de caractères des mots dans une colonne particulière?


12

J'ai un fichier CSV comme celui-ci:

abd,123,egypt,78
cde,456,england,45

Comment puis-je obtenir le nombre de caractères des seuls mots de la troisième colonne?

Je n'arrive pas à comprendre comment y arriver wc.

Réponses:


23
cut -d, -f3 | tr -d '\n' | wc -m

(rappelez-vous que wc -ccompte les octets, pas les caractères:

$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -c
7
$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -m
6

)


Mais il précise «je ne suis pas en mesure d'utiliser la wccommande pour obtenir la sortie!
— mikeserv

3
@mikeserv, que j'interprète car je n'ai pas pu me wcdonner le nombre de caractères, c'est pourquoi je montre comment utiliser wcdans ce contexte.
— Stéphane Chazelas

Oh .... C'est une interprétation très valable qui ne m'est
— jamais venue à l'esprit

22
awk -F, '{sum+=length($3)}; END {print +sum}' file

3
Amen; awka été conçu pour traiter les fichiers basés sur des colonnes, ligne par ligne. Le problème est parfaitement adapté à l'outil.
— Ray

À quoi sert + dans {print + sum}? {print sum} fonctionne aussi bien.
— spuder

3
@spuder, c'est pour imprimer 0au lieu d'une ligne vide lorsque le fichier d'entrée est vide.
— Stéphane Chazelas

2
@Ray, d'autre part, la tâche peut être accomplie en ayant 3 utilitaires de base (chacun étant une fraction de la taille de awk) coopérant au cas (travaillant simultanément) dans un esprit Unix typique. Vous remarquerez peut-être comment le cut + tr + wc one est 5 types aussi rapide que cet awk lui-même 5 fois plus rapide que perlcelui. (au moins sur mon système, dans un environnement local UTF8, essayé sur un fichier de 100 Mo).
— Stéphane Chazelas

5

Une perlsolution:

perl -Mopen=:locale -F, -anle '$sum += length($F[2]); END{print $sum}' file

ou une version plus courte:

perl -Mopen=:locale -F, -anle '$sum += length($F[2])}{print $sum' file

Notez qu'il renvoie un nombre d'octets, pas nécessairement un nombre de caractères.
— Stéphane Chazelas

@StephaneChazelas: length () renvoie le nombre de caractères logiques, pas d'octets physiques selon perldoc.
— cuonglm

Mais vous avez besoin -Mopen=:localepour perlutiliser l'utilisateur / définition du système de ce personnage est, sinon il prend les caractères sont des octets. Essayez une a,1,españa,2entrée dans un environnement local UTF-8 (la valeur par défaut sur la plupart des systèmes).
— Stéphane Chazelas

@StephaneChazelas: Oh, mis à jour ma réponse. Merci pour le bon point!
— cuonglm

3
cut -d, -f3 <<\DATA | grep -o . | grep -c .
abd,123,egypt,78
cde,456,england,45
DATA

#OUTPUT
12

3

Vous pouvez également utiliser

awk -F, '{printf "%s", $3}' file | wc -m

3

En Perl:

perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file

1

Avec votre exemple de fichier comme ceci:

$ cat sample.txt 
abd,123,egypt,78
cde,456,england,45

$ awk -F, '{print $3}' sample.txt | while read i; do echo "$i" | \
    tr -d '\n' | wc -m; done
5
7

Travailler avec wcpour obtenir le nombre de chaque ligne peut être délicat. Vous devez l'appeler pour chaque chaîne de la colonne 3 individuellement, ce qui rend un peu difficile de faire ce que vous voulez. Vous devez parcourir chaque ligne de votre CSV, extraire la colonne 3 puis la présenter wcpour obtenir le nombre de caractères.


0

Utilisation de sedetawk

sed 's/.*,.*,\(.*\),.*/\1/g' file | awk -v FS="" '{print NF;}'

Exemple:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | sed 's/.*,.*,\(.*\),.*/\1/g' | awk -v FS="" '{print NF;}'
5
7

Deux awk

awk -F, '{print $3}' file | awk -v FS="" '{print NF;}'

Exemple:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.