Wie erhalte ich die Zeichenanzahl von Wörtern in einer bestimmten Spalte?

12

Ich habe eine CSV-Datei wie diese:

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

Wie kann ich die Anzahl der Zeichen nur für die Wörter in der 3. Spalte ermitteln?

Ich kann nicht herausfinden, wie ich wcdazu komme.

user3116123
quelle

Antworten:

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

(Denken Sie daran, dass es sich um wc -cBytes handelt, nicht um Zeichen:

$ 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
quelle
Aber er gibt an: "Ich kann den wcBefehl nicht verwenden , um eine Ausgabe zu erhalten!"
mikeserv
3
@mikeserv, was ich interpretiere, da ich nicht in der Lage war wc, mir die Anzahl der Zeichen zu geben, weshalb ich zeige, wie man wcin diesem Kontext verwendet.
Stéphane Chazelas
Oh ... das ist eine sehr gültige Interpretation, die mir nie in den
Sinn gekommen ist
22
awk -F, '{sum+=length($3)}; END {print +sum}' file
Hauke ​​Laging
quelle
3
Amen; awkwurde für die zeilenweise Verarbeitung von spaltenbasierten Dateien entwickelt. Das Problem ist für das Werkzeug perfekt geeignet.
Ray
Was ist der Zweck von + in {print + sum}? {Drucksumme} funktioniert genauso gut.
Spuder
3
@spuder, das soll 0anstelle einer leeren Zeile gedruckt werden, wenn die Eingabedatei leer ist.
Stéphane Chazelas
2
@Ray hingegen kann die Aufgabe gelöst werden, indem drei grundlegende Dienstprogramme (von denen jedes nur einen Bruchteil der Größe hat awk) im typischen Unix-Geist mit dem Fall zusammenarbeiten (und gleichzeitig arbeiten). Sie werden feststellen, dass der Befehl cut + tr + wc 5-mal so schnell ist wie der Befehl awk perl. (Zumindest auf meinem System, in einem UTF8-Gebietsschema, hat es mit einer 100-MB-Datei versucht).
Stéphane Chazelas
5

Eine perlLösung:

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

oder eine kürzere Version:

perl -Mopen=:locale -F, -anle '$sum += length($F[2])}{print $sum' file
cuonglm
quelle
Beachten Sie, dass die Anzahl der Bytes zurückgegeben wird, nicht unbedingt die Anzahl der Zeichen.
Stéphane Chazelas
@StephaneChazelas: length () gibt die Anzahl der logischen Zeichen zurück, laut perldoc keine physischen Bytes.
Dienstag,
Aber Sie müssen -Mopen=:localefür perlden Benutzer / System-Definition von verwenden , was ein Zeichen ist, sonst nimmt sie Zeichen Bytes sind. Probieren Sie eine a,1,españa,2Eingabe in einem UTF-8-Gebietsschema aus (die Standardeinstellung auf den meisten Systemen).
Stéphane Chazelas
@StephaneChazelas: Oh, meine Antwort wurde aktualisiert. Danke für den guten Punkt!
Dienstag,
3
cut -d, -f3 <<\DATA | grep -o . | grep -c .
abd,123,egypt,78
cde,456,england,45
DATA

#OUTPUT
12
mikeserv
quelle
3

Sie könnten auch verwenden

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

In Perl:

perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file
Joseph R.
quelle
1

Mit deiner Beispieldatei wie folgt:

$ 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

Es wckann schwierig sein, mit zu arbeiten, um die Anzahl der Zeilen zu ermitteln. Sie müssen es für jeden String aus Spalte 3 einzeln aufrufen, was es etwas schwierig macht, das zu tun, was Sie wollen. Sie müssen jede Zeile Ihrer CSV-Datei durchsehen, Spalte 3 extrahieren und dann anzeigen wc, um die Anzahl der Zeichen zu ermitteln.

slm
quelle
0

Verwenden von sedundawk

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

Beispiel:

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

Zwei awks

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

Beispiel:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
Avinash Raj
quelle