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

use*_*655 5 bash patterns

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

文件 1

905:john: abc123: john@doe.com: US  
920:eric: ericaA: eric007@gmail.com: US  
1000: rio: ri0ri0: rio@yahoo.com: IN  
Run Code Online (Sandbox Code Playgroud)

文件 2

nathen <tab> nathen@yman.com <tab> 764323545 <tab> UK
thomas <tab> thom@gmail.com <tab> 563363421 <tab> UK
ian <tab> rt@gmail.com <tab> 3453245472 <tab> SP
Run Code Online (Sandbox Code Playgroud)

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

输出将是:

对于文件 1

5  
5 
5 
5   
Run Code Online (Sandbox Code Playgroud)

对于文件 2

4  
4 
4 
4
Run Code Online (Sandbox Code Playgroud)

我想对带有任何分隔符的任何文件进行概括。可能是- | : \space+ \tab+

部分文件如下:

| hetro@gmail.com | er34532 |  
| rt@gmail.com | 764474 |
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 10

对于具有简单格式的空白分隔单词的 file2,请尝试:

$ awk '{print NF}' file2
4
4
4
Run Code Online (Sandbox Code Playgroud)

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

对于file1,其中的单词可能用冒号或空格分隔,我们需要:在字段分隔符中添加:

$ awk -F'[: \t]+' '{print NF}' file1
5
5
5
Run Code Online (Sandbox Code Playgroud)

改进

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

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

或者这对于file2:

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

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

概括

如果字段分隔符可以是 - | : 或 ,然后使用:

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

例子:

$ cat file3
| hetro@gmail.com | er34532 |  
| rt@gmail.com | 764474 |
$ awk -F'[-|: \t]+' '{gsub(/^[[-\|: \t]+|[[-\|: \t]+$/, ""); print NF}' file3
2
2
Run Code Online (Sandbox Code Playgroud)