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