如何在awk中创建子数组?

时间:2011-08-23 18:30:18

标签: awk arrays

给出如下列表:

Dog bone
Cat catnip
Human ipad
Dog collar
Dog collar
Cat collar
Human car
Human laptop
Cat catnip
Human ipad

如何使用awk获得这样的结果:

Dog bone 1
Dog collar 2
Cat catnip 2
Cat collar 1
Human car 1
Human laptop 1
Human ipad 2

我需要一个子阵列吗?在我看来,需要一系列“所有者”,其中包含“事物”阵列。

我想用awk来做这个,因为这是awk中另一个程序的下标,而现在,我宁愿不创建一个单独的程序。

顺便说一句,我已经可以使用sort和grep -c以及其他一些管道来完成它,但我真的无法在巨大的数据文件上做到这一点,因为它太慢了。我被告知,Awk通常要快得多。

 Thanks, 
 Kevin

编辑:请注意,这些列实际上并不像这样,在真实文件中,它们更像是$ 8和$ 11列。我这样说是因为我想如果他们在彼此旁边,我可以加入一个awk正则表达式/ / Dog \ Collar /或其他东西。但我不会有这个选择。 -Thanks!

2 个答案:

答案 0 :(得分:2)

GNU Awk对multi-dimensional arrays有一些支持,但它实际上只是巧妙地将键连接起来形成一种复合键。

我建议使用learning Perl,如果你喜欢awk,你会非常熟悉,但Perl支持真Lists of Lists。一般来说,Perl会比awk更进一步。


重新评论:

我不是想成为优秀者。我知道你问过如何使用特定工具完成任务,awk。我确实提供了一个文档链接,用于在awk中模拟多维数组。但是awk并没有很好地完成这项任务,而且近20年前它被Perl有效地取代了。

如果你问如何骑自行车穿越湖泊,我告诉你它在船上会更容易,我认为这不合理。如果我告诉你,首先建造一座桥梁或者首先发明一辆星际迷航运输车会更容易,那么那将是不合理的。

答案 1 :(得分:2)

awk没有多维数组,但您可以通过构建2D-ish数组键进行管理:

awk '{count[$1 " " $2]++} END {for (key in count) print key, count[key]}' | sort

,根据您的输入,输出

Cat catnip 2
Cat collar 1
Dog bone 1
Dog collar 2
Human car 1
Human ipad 2
Human laptop 1

在这里,我使用空格来分隔键值。如果数据包含空格,则可以使用输入中未显示的其他字符。当我有一个特定的字段分隔符时,我通常使用array[$a FS $b],因为这保证不会出现在字段值中。

相关问题