如何获得特定列中单词的字符数?


12

我有这样的CSV文件:

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

如何仅获取第三列单词的字符数?

我不知道该怎么wc做。

Answers:


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 2014年

3
@mikeserv,我将其解释为无法获得wc字符数,这就是为什么我展示了如何wc在这种情况下使用的原因。
斯特凡Chazelas

哦....这是一个非常有效的解释,我从未发生过……
mikeserv

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

3
阿们 awk设计用于逐行处理基于列的文件。该问题非常适合该工具。

{print + sum}中+的作用是什么?{print sum}也一样。
spuder 2014年

3
@spuder,即0在输入文件为空时打印而不是空行。
斯特凡Chazelas

2
另一方面,@ Ray可以通过awk在典型的Unix精神中让3个基本实用程序(同时使用一个大小的一个)与案例配合使用(同时工作)来实现。您可能会注意到cut + tr + wc一种是5种类型的,其速度是该awk一种本身的5倍perl。(至少在我的系统上,在UTF8语言环境中,尝试使用100MB文件)。
斯特凡Chazelas

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

请注意,它返回字节计数,而不必返回字符计数。
斯特凡Chazelas

@StephaneChazelas:length()返回逻辑字符计数,而不是根据perldoc的物理字节。
cuonglm 2014年

但是,你需要-Mopen=:localeperl使用的字符是用户/系统的定义,否则它假定字符是字节。尝试a,1,españa,2使用UTF-8语言环境(大多数系统中的默认设置)的输入。
斯特凡Chazelas

@StephaneChazelas:哦,更新了我的答案。感谢您的意见!
cuonglm 2014年

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

#OUTPUT
12

3

您也可以使用

awk -F, '{printf "%s", $3}' file | wc -m


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

使用sedawk

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的

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.