这就是我在做什么。
文本文件以逗号分隔,有三个字段, 我想提取包含相同第二个字段的所有行 超过三次。
文本文件(文件名为“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
有人可以告诉我我做错了吗?
答案 0 :(得分:3)
对文件进行两次传递相对简单。在第一遍中,计算第2列中每个值的出现次数。在第二次过程中,打印出第2列中的值出现的行超过阈值3次的行。
awk -F, 'FNR == NR { count[$2]++ }
FNR != NR { if (count[$2] > 3) print }' text text
第一行代码处理第一遍;它计算第二列的每个不同值的出现次数。
第二行代码处理第二遍;如果第2列中的值计数超过3次,则打印整行。
如果输入仅在管道上而不是作为文件可用(因此您无法对数据进行两次传递),则此操作无效。然后你必须更加努力。