2011-08-23 59 views
1

给予类似的列表:如何在awk中创建子文件?

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 /或其他东西。但我不会有这个选择。 -谢谢!

回答

2

awk没有多维数组,但你可以通过构建2D上下的数组键管理:

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],因为这保证不出现在字段值中。

+0

地狱是的。我不敢相信这是多么简单。出于某种原因,我认为我不得不做一些棘手的事情,把一个数组的两个索引...谢谢你的朋友 – Kevin

+0

嗨,感谢您的额外评论。用我正在排序的实际文件,这是更复杂,但一致的,我应该能够找到一个合适的FS分隔符。 – Kevin

2

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

我推荐learning Perl,如果你喜欢awk,它会对你很熟悉,但是Perl支持真正的Lists of Lists。一般来说,Perl将比awk更进一步。


回复您的评论:

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

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

+0

+1 for perl - 即使awk需要多行(结构化)编程来实现此目的。 –

+0

对不起,我理解这种类型的回应,但这不是一个真正的答案。我不回答与windows相关的问题,“你应该重新格式化并安装一个真正的操作系统,比如Linux,解决问题。”所以这也不应该被接受。 – Kevin

+0

不用担心。感谢您的评论。 –