У меня есть файл CSV, как это:
abd,123,egypt,78
cde,456,england,45
Как я могу получить количество символов только для слов 3-го столбца?
Я не могу понять, как wc
это сделать.
У меня есть файл CSV, как это:
abd,123,egypt,78
cde,456,england,45
Как я могу получить количество символов только для слов 3-го столбца?
Я не могу понять, как wc
это сделать.
Ответы:
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
дать мне счетчик символов , поэтому я показываю, как использовать wc
в этом контексте.
awk -F, '{sum+=length($3)}; END {print +sum}' file
awk
был разработан для обработки файлов на основе столбцов, построчно. Задача идеально подходит для инструмента.
0
вместо пустой строки, когда входной файл пуст.
awk
), взаимодействующих с кейсом (работающих одновременно) в типичном духе Unix. Вы можете заметить, что cut + tr + wc one на 5 типов быстрее, чем этот awk one в 5 раз быстрее, чем perl
тот. (по крайней мере, в моей системе в локали UTF8 пробовал файл размером 100 МБ).
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
-Mopen=:locale
для perl
использования пользователя / определения системы , что персонаж, в противном случае он принимает символы байты. Попробуйте a,1,españa,2
ввести код в UTF-8 (по умолчанию в большинстве систем).
С вашим примером файла так:
$ 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
чтобы получить количество символов.
Использование 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
wc
команду для получения результата!»