在文本文件中打印包含相同第二个字段超过3次的行

时间:2015-07-25 03:42:15

标签: awk

这就是我在做什么。

文本文件以逗号分隔,有三个字段, 我想提取包含相同第二个字段的所有行 超过三次。

文本文件(文件名为“text”):

11,keyword1,content1
4,keyword1,content3
5,keyword1,content2
6,keyword2,content5
6,keyword2,content5
7,keyword1,content4
8,keyword1,content2
1,keyword1,content2

我的命令如下。将整个文本文件包含在awk和grep中,每行第二个字段并计算行数。 如果行数大于2,则打印整行。

命令:

awk -F "," '{ "cat text | grep "$2 " | wc -l" | getline var; if ( 2 < var ) print $0}' text

但是,命令输出只包含前三行, 而不是打印也是最后三行包含“keyword1”的行,在文本中出现六次。

结果:

11,keyword1,content1
4,keyword1,content3
5,keyword1,content2

我的预期结果:

11,keyword1,content1
4,keyword1,content3
5,keyword1,content2
7,keyword1,content4
8,keyword1,content2
1,keyword1,content2

有人可以告诉我我做错了吗?

1 个答案:

答案 0 :(得分:3)

对文件进行两次传递相对简单。在第一遍中,计算第2列中每个值的出现次数。在第二次过程中,打印出第2列中的值出现的行超过阈值3次的行。

awk -F, 'FNR == NR { count[$2]++ }
         FNR != NR { if (count[$2] > 3) print }' text text

第一行代码处理第一遍;它计算第二列的每个不同值的出现次数。

第二行代码处理第二遍;如果第2列中的值计数超过3次,则打印整行。

如果输入仅在管道上而不是作为文件可用(因此您无法对数据进行两次传递),则此操作无效。然后你必须更加努力。