Как узнать количество символов в определенном столбце?

12

У меня есть файл CSV, как это:

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

Как я могу получить количество символов только для слов 3-го столбца?

Я не могу понять, как wcэто сделать.

user3116123
источник

Ответы:

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в этом контексте.
Стефан Шазелас
Ох .... Это очень правильное толкование, которое мне никогда не приходило в голову ...
mikeserv
22
awk -F, '{sum+=length($3)}; END {print +sum}' file
Хауке Лагинг
источник
3
Аминь; awkбыл разработан для обработки файлов на основе столбцов, построчно. Задача идеально подходит для инструмента.
Рэй
Какова цель + в {print + sum}? {print sum} работает так же хорошо.
spuder
3
@spuder, это печатать 0вместо пустой строки, когда входной файл пуст.
Стефан Шазелас
2
@Ray, с другой стороны, эта задача может быть решена с помощью трех базовых утилит (каждая из которых является частью размера awk), взаимодействующих с кейсом (работающих одновременно) в типичном духе Unix. Вы можете заметить, что cut + tr + wc one на 5 типов быстрее, чем этот awk one в 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
cuonglm
источник
Обратите внимание, что он возвращает количество байтов, не обязательно количество символов.
Стефан Шазелас
@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
mikeserv
источник
3

Вы также можете использовать

awk -F, '{printf "%s", $3}' file | wc -m
Тердон
источник
3

В Perl:

perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file
Джозеф Р.
источник
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чтобы получить количество символов.

SLM
источник
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's

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
Авинаш Радж
источник