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.

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

)


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

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

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

3

Sie könnten auch verwenden

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

3

In Perl:

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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.