Come posso ottenere il conteggio dei caratteri delle parole in una determinata colonna?


12

Ho un file CSV come questo:

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

Come posso ottenere il conteggio dei caratteri delle sole parole della terza colonna?

Non riesco a capire come wcfarlo.

Risposte:


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

(ricorda che wc -cconta i byte, non i caratteri:

$ 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

)


Ma specifica "Non sono in grado di usare il wccomando per ottenere l'output!"
Mikeserv,

3
@mikeserv, che interpreto come non sono riuscito a wcdarmi il conteggio dei personaggi, motivo per cui mostro come usare wcin questo contesto.
Stéphane Chazelas,

Oh .... Questa è un'interpretazione molto valida che non mi è mai
venuta

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

3
Amen; awkè stato progettato per l'elaborazione di file basati su colonna, riga per riga. Il problema è perfettamente adatto allo strumento.
Ray

Qual è lo scopo di + in {print + sum}? {print sum} funziona altrettanto bene.
spuder

3
@spuder, è quello di stampare 0invece di una riga vuota quando il file di input è vuoto.
Stéphane Chazelas,

2
@Ray, d'altra parte, il compito può essere raggiunto avendo 3 utilità di base (ognuna delle quali è una frazione delle dimensioni di awk) che cooperano al caso (lavorando contemporaneamente) nel tipico spirito Unix. Potresti notare come il cut + tr + wc sia 5 tipi più veloce di questo awk stesso 5 volte più veloce di perlquello. (almeno sul mio sistema, in una locale UTF8, provato su un file da 100 MB).
Stéphane Chazelas,

5

Una perlsoluzione:

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

o una versione più breve:

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

Si noti che restituisce un conteggio di byte, non necessariamente un conteggio di caratteri.
Stéphane Chazelas,

@StephaneChazelas: length () restituisce il conteggio dei caratteri logici, non byte fisici secondo perldoc.
cuonglm,

Ma è necessario -Mopen=:localeper perlutilizzare il / definizione del sistema dell'utente di ciò che un personaggio è, altrimenti assume caratteri sono byte. Prova un a,1,españa,2input in una locale UTF-8 (impostazione predefinita sulla maggior parte dei sistemi).
Stéphane Chazelas,

@StephaneChazelas: Oh, ho aggiornato la mia risposta. Grazie per il buon punto!
cuonglm,

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

#OUTPUT
12

3

Puoi anche usare

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

3

In Perl:

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

1

Con il tuo file di esempio in questo modo:

$ 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

Lavorare con wcper ottenere il conteggio di ogni riga può essere complicato. Devi chiamarlo per ogni stringa dalla colonna 3 singolarmente, il che rende un po 'complicato fare quello che vuoi. Devi guardare attraverso ogni riga del tuo CSV, estrarre la colonna 3 e quindi presentarla wcper ottenere il conteggio dei personaggi.


0

Utilizzando sedeawk

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

Esempio:

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

Due awk

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

Esempio:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.