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
.
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:
cut -d, -f3 | tr -d '\n' | wc -m
(rappelez-vous que wc -c
compte 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
)
wc
donner le nombre de caractères, c'est pourquoi je montre comment utiliser wc
dans ce contexte.
awk -F, '{sum+=length($3)}; END {print +sum}' file
awk
a été conçu pour traiter les fichiers basés sur des colonnes, ligne par ligne. Le problème est parfaitement adapté à l'outil.
0
au lieu d'une ligne vide lorsque le fichier d'entrée est vide.
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 perl
celui. (au moins sur mon système, dans un environnement local UTF8, essayé sur un fichier de 100 Mo).
Une perl
solution:
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
-Mopen=:locale
pour perl
utiliser 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,2
entrée dans un environnement local UTF-8 (la valeur par défaut sur la plupart des systèmes).
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 wc
pour 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 wc
pour obtenir le nombre de caractères.
Utilisation de sed
etawk
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
wc
commande pour obtenir la sortie!