BASH:计算文档每行中的单词数

BASH:计算文档每行中的单词数

我需要识别文本文件中的模式以进行进一步分析。因此输入文件可能包含半结构化文本,如下所示;

文件1

905:john: abc123: [email protected]: US  
920:eric: ericaA: [email protected]: US  
1000: rio: ri0ri0: [email protected]: IN  

文件2

nathen <tab> [email protected] <tab> 764323545 <tab> UK
thomas <tab> [email protected] <tab> 563363421 <tab> UK
ian <tab> [email protected] <tab> 3453245472 <tab> SP

每个文档的一行字数可能有所不同。分隔符也各不相同,但对于每个文档都是唯一的。我想要的是计算每个文档中每行的字数。

输出将是:

对于文件1

5  
5 
5 
5   

对于文件2

4  
4 
4 
4

我想将其推广到任何带有任何分隔符的文件。它可能是- | : \space+ \tab+

部分文件如下:

| [email protected] | er34532 |  
| [email protected] | 764474 |

答案1

对于 file2 及其由空格分隔的单词的简单格式,请尝试:

$ awk '{print NF}' file2
4
4
4

在 awk 中,NF是字段的数量。默认情况下,在 awk 中,单词字符由空格分隔。

对于 file1,单词可以用冒号或空格分隔,我们需要添加:到字段分隔符:

$ awk -F'[: \t]+' '{print NF}' file1
5
5
5

改进

如果一行有前导或尾随空格,awk 会认为有额外的字段。我们可以通过在计算字段之前删除任何此类空格来解决这个问题,就像 file1 一样:

awk -F'[: \t]+' '{gsub(/^[: \t]+|[: \t]+$/, ""); print NF}' file1

或者 file2 是这样的:

awk '{gsub(/^[[:space:]]+|[[:space:]]+$/, ""); print NF}' file2

在正则表达式中,^[[:space:]]+匹配前导空格并[[:space:]]+$匹配尾随空格。它们在命令中的组合gsub将删除两者。

概括

如果字段分隔符可以是 - | 中的任何一个: 或 ,然后使用:

awk -F'[-|: \t]+' '{gsub(/^[[-\|: \t]+|[[-\|: \t]+$/, ""); print NF}'

例子:

$ cat file3
| [email protected] | er34532 |  
| [email protected] | 764474 |
$ awk -F'[-|: \t]+' '{gsub(/^[[-\|: \t]+|[[-\|: \t]+$/, ""); print NF}' file3
2
2

答案2

你可以使用这个伎俩在perl中计算与您选择的单词正则表达式匹配的子字符串,例如计算由perl的\w字符集组成的“单词”序列,并用@and增强.

perl -lne 'print my $count = () = $_ =~ /[\w@.]+/g' somefile

这使

$ perl -lne 'print my $count = () = $_ =~ /[\w@.]+/g' file1
5
5
5

$ perl -lne 'print my $count = () = $_ =~ /[\w@.]+/g' file2
4
4
4

为您的示例文件。

相关内容