如何在awk中创建子阵列?

如何在awk中创建子阵列?,awk,arrays,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 我需要一个子数组吗?在我看来,似乎需要一个由“事

给出如下列表:

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 regex~/Dog\Collar/或其他东西。但我没有这个选择-谢谢

GNU Awk对有一些支持,但它实际上只是巧妙地将键串联起来,形成一种复合键

我推荐,如果您喜欢awk,这对您来说是相当熟悉的,但是Perl支持true。一般来说,Perl将比awk更进一步


请回复您的评论:

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


如果你问如何骑自行车过湖,我告诉你坐船会更容易,我不认为这是不合理的。如果我告诉你,首先建造一座桥,或者首先发明《星际迷航》运输机会更容易,那就不合理了。

GNU Awk对它有一些支持,但它实际上只是巧妙地将键串联起来,形成一种复合键

我推荐,如果您喜欢awk,这对您来说是相当熟悉的,但是Perl支持true。一般来说,Perl将比awk更进一步


请回复您的评论:

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


如果你问如何骑自行车过湖,我告诉你坐船会更容易,我不认为这是不合理的。如果我告诉你,首先建造一座桥或者首先发明一个星际迷航运输机会更容易,那就不合理了。

awk没有多维数组,但你可以通过构造二维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

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

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

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

+1对于perl-即使是awk也需要多行(结构化)编程来实现这一点。对不起,我理解这种类型的响应,但这不是真正的答案。我不会在windows相关的问题中回答“你应该重新格式化并安装一个真正的操作系统,比如Linux,问题解决了。”所以这也不应该被接受。不用担心。谢谢你的评论。+1对于perl-即使是awk也需要多行(结构化)编程来实现这一点。对不起,我理解这种类型的响应,但这不是真正的答案。我不会在windows相关的问题中回答“你应该重新格式化并安装一个真正的操作系统,比如Linux,问题解决了。”所以这也不应该被接受。不用担心。谢谢你的评论,是的。我不敢相信这有多简单。出于某种原因,我认为我必须做一些棘手的事情来为一个数组放置两个索引。。。谢谢buddyHi,也谢谢你的补充评论。对于我正在排序的实际文件,它更复杂,但也更一致,我应该能够找到一个合适的FS分隔符。我不敢相信这有多简单。出于某种原因,我认为我必须做一些棘手的事情来为一个数组放置两个索引。。。谢谢buddyHi,也谢谢你的补充评论。对于我正在排序的实际文件(更复杂但一致),我应该能够找到合适的FS分隔符。