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 wc
to zrobić.
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 wc
to zrobić.
Odpowiedzi:
cut -d, -f3 | tr -d '\n' | wc -m
(pamiętaj, że wc -c
liczy 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
)
wc
liczby znaków, dlatego pokazuję, jak używać wc
w tym kontekście.
awk -F, '{sum+=length($3)}; END {print +sum}' file
awk
został zaprojektowany do przetwarzania plików kolumnowych, linia po linii. Problem idealnie pasuje do narzędzia.
0
zamiast pustej linii, gdy plik wejściowy jest pusty.
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ż perl
jedno. (przynajmniej w moim systemie, w lokalizacji UTF8, próbowałem na pliku 100 MB).
perl
Rozwią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
-Mopen=:locale
do perl
korzystania z obsługi / definicję systemu, co jest postać, w przeciwnym razie przyjmuje znaki są bajty. Wypróbuj a,1,españa,2
dane wejściowe w ustawieniach regionalnych UTF-8 (domyślne w większości systemów).
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 wc
licznikiem 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ą, wc
aby uzyskać liczbę znaków.
Korzystanie sed
iawk
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
wc
polecenia, aby uzyskać dane wyjściowe!”