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.