Jak uzyskać liczbę znaków słów w określonej kolumnie?


12

Mam plik CSV taki jak ten:

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

Jak mogę uzyskać liczbę znaków tylko słów z 3 kolumny?

Nie mogę wymyślić, jak wcto zrobić.

Odpowiedzi:


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

(pamiętaj, że wc -cliczy się bajty, a nie znaki:

$ 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

)


Ale określa: „Nie mogę użyć wcpolecenia, aby uzyskać dane wyjściowe!”
mikeserv

3
@mikeserv, który interpretuję, ponieważ nie byłem w stanie uzyskać wcliczby znaków, dlatego pokazuję, jak używać wcw tym kontekście.
Stéphane Chazelas

Och ... To bardzo ważna interpretacja, która nigdy nie
przyszła

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

3
Amen; awkzostał zaprojektowany do przetwarzania plików kolumnowych, linia po linii. Problem idealnie pasuje do narzędzia.
Ray

Jaki jest cel + w {print + sum}? {print sum} działa równie dobrze.
spuder

3
@spuder, to jest drukowanie 0zamiast pustej linii, gdy plik wejściowy jest pusty.
Stéphane Chazelas

2
@Ray, z drugiej strony, zadanie można wykonać, mając 3 podstawowe narzędzia (każde z nich o ułamek wielkości awk) współpracujące z obudową (działające jednocześnie) w typowym duchu uniksowym. Możesz zauważyć, że cięcie + tr + wc jest 5 rodzajów tak szybkie, jak samo awkowanie 5 razy szybciej niż perljedno. (przynajmniej w moim systemie, w lokalizacji UTF8, próbowałem na pliku 100 MB).
Stéphane Chazelas

5

perlRozwiązanie:

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

lub krótsza wersja:

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

Zauważ, że zwraca liczbę bajtów, niekoniecznie liczbę znaków.
Stéphane Chazelas

@StephaneChazelas: length () zwraca liczbę znaków logicznych, a nie bajtów fizycznych zgodnie z perldoc.
cuonglm

Ale trzeba -Mopen=:localedo perlkorzystania z obsługi / definicję systemu, co jest postać, w przeciwnym razie przyjmuje znaki są bajty. Wypróbuj a,1,españa,2dane wejściowe w ustawieniach regionalnych UTF-8 (domyślne w większości systemów).
Stéphane Chazelas

@StephaneChazelas: Oh, zaktualizowałem moją odpowiedź. Dzięki za dobry punkt!
cuonglm

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

#OUTPUT
12



1

Z przykładowym plikiem takim:

$ 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

Praca z wclicznikiem każdej linii może być trudna. Musisz wywołać go dla każdego ciągu z kolumny 3 osobno, co sprawia, że ​​robienie tego, co chcesz, jest nieco trudne. Musisz przejrzeć każdy wiersz pliku CSV, wyodrębnić kolumnę 3, a następnie przedstawić ją, wcaby uzyskać liczbę znaków.


0

Korzystanie sediawk

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

Przykład:

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

Dwa awk

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

Przykład:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.