awk循环打印错误次数

awk loop printing wrong number of times

我有一个这样的文件(space 选项卡):

Agent 299301 1
Person 259672 2
Place 208239 3
Location 208239 4
PopulatedPlace 156701 5
Region 153246 6
AdministrativeRegion 153246 7
Work 96536 8
Agent 299301 1
Person 259672 2

我想 return 每行的不同数字在第二列中出现的次数与它出现的次数一样多

例如: 先是return数1299301次,然后return2259672次,然后return3208239次

为此,我正在使用这个 awk 命令:

cat file | awk -F ' ' '{for (i=1; i<=; i++) print NR}'  > output

它似乎适用于第二列中的小数字,但在此文件示例中,我不知道为什么 returning 每个数字(在本例中为 1)不正确的数字次数:

它是 returning 数 1 558973 次而不是 299301

但它 return 是文件其余行中的正确数字(数字 2, 3, 4...

如果我在文件中添加更多行,它也会 return 错误次数 2, 3, 4 直到 9,但它也适用于数字 10, 11, 12, 13...

所以我不知道为什么会这样,希望你能帮助我。

提前致谢。

当输入问题中显示的内容时,问题中显示的程序为我输出“1”正好 299301 次,如您所料。我倾向于认为 @choroba 对这个问题的评论表明了 不同 程序的性质,您用它观察到 558973 行“1”。也就是说,这个,或者实质上等同的东西:

cat file | awk -F ' ' '{for (i=1; i<=; i++) print }'  > output

不同之处在于,一个打印 NR,输入行号,而另一个打印 ,从输入行读取的第三个字段。

错的不是您的脚本,而是您尝试验证其输出的方式。您正在将输出传输到 grep '1' | wc -l 或类似的,因此正在计算 1 的数量(299301)+ 10 的数量(259672 ) 这样就得到了总数 558973.

$ awk '{for (i=1; i<=; i++) print NR}' file | grep '1' | wc -l
558973

$ awk '{for (i=1; i<=; i++) print NR}' file | grep '^1$' | wc -l
299301

顺便说一句,cat file-F ' ' 并没有造成任何真正的伤害,但在这种情况下它们也没有任何用处,只需像我上面那样使用 awk '{for (i=1; i<=; i++) print NR}' file