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.