2011-08-23 56 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

不用擔心。感謝您的評論。 –