Як я можу отримати кількість символів у певному стовпчику?


12

У мене такий файл CSV:

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

Як я можу отримати кількість символів лише у словах 3-го стовпчика?

Я не можу зрозуміти, як wcце зробити.

Відповіді:


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

(пам'ятайте, що wc -cрахує байти, а не символи:

$ 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команду для отримання виводу!"
mikeserv

3
@mikeserv, яку я інтерпретую так, як мені не вдалося wcдати мені підрахунок персонажів , тому я показую, як використовувати wcв цьому контексті.
Стефан Шазелас

О .... Це дуже
вагоме

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

3
Амінь; awkбув розроблений для обробки файлів на основі стовпців, по черзі. Проблема ідеально підходить для інструменту.
Рей

Яка мета + у {print + sum}? {print sum} працює так само добре.
спудер

3
@spuder, це друкувати 0замість порожнього рядка, коли вхідний файл порожній.
Стефан Шазелас

2
@Ray, з іншого боку, завдання можна досягти, використовуючи 3 основні утиліти (кожна з яких є часткою розміру awk), які співпрацюють у справі (працюють одночасно) у типовому дусі Unix. Ви можете помітити, як скоротити + tr + wc один на 5 видів швидше, ніж цей буден сам у 5 разів швидше, ніж perlодин. (принаймні у моїй системі, у локальній локалізації UTF8, пробували файл у розмірі 100 Мб)
Стефан Шазелас

5

perlрішення:

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

або коротша версія:

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

Зауважте, що він повертає кількість байтів, не обов'язково кількість символів.
Стефан Шазелас

@StephaneChazelas: length () повертає кількість логічних символів, а не фізичні байти відповідно до perldoc.
cuonglm

Але вам потрібно -Mopen=:localeдля perlвикористання користувача / визначення системи , що персонаж, в іншому випадку він приймає символи байти. Спробуйте скористатись a,1,españa,2входом у локальній системі UTF-8 (типова для більшості систем).
Стефан Шазелас

@StephaneChazelas: О, оновив мою відповідь. Дякуємо за хороший бал!
cuonglm

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

#OUTPUT
12



1

З таким файлом зразка:

$ 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

Працювати з wcпідрахунком кожного рядка може бути складно. Ви повинні називати його для кожної строки з стовпця 3 окремо, що робить трохи складніше робити те, що ви хочете. Ви повинні переглянути кожен рядок CSV, витягнути стовпець 3, а потім представити його, wcщоб отримати кількість символів.


0

Використання sedтаawk

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

Приклад:

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

Дві букси

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

Приклад:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.