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.

user3116123
la source

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

)

Stéphane Chazelas
la source
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
Hauke ​​Laging
la source
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
cuonglm
la source
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
mikeserv
la source
3

Vous pouvez également utiliser

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

En Perl:

perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file
Joseph R.
la source
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.

slm
la source
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
Avinash Raj
la source