我需要识别文本文件中的模式以进行进一步分析。因此输入文件可能包含如下半结构化文本;
文件 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)