2013-03-06 64 views
1

下面是從文件中的RGB值的列表稱爲「colors.txt」這個AWK命令如何保持數組元素順序?

255 222 0 
101 153 255 
255 153 0 
13 112 84 
13 112 84 
255 222 0 
13 112 84 
9 112 84 

我可以用一個awk數組

awk '{arr[($1","$2","$3)]} END {for (i in arr) print i}' colors.txt 

這使得到從文件中5個獨特的RGB組合:

9,112,84 
255,222,0 
13,112,84 
255,153,0 
101,153,255 

請注意,這些文件的順序並不在輸入文件中。但是,此命令

awk 'arr[($1","$2","$3)]++==0 {print ($1","$2","$3)}' colors.txt 

255,222,0 
101,153,255 
255,153,0 
13,112,84 
9,112,84 

保留該順序。這是如何工作的?我發現了second command version here

回答

4

這條線:

awk '{arr[($1","$2","$3)]} END {for (i in arr) print i}' colors.txt 

打印你讀所有的輸入之後亂碼,因爲哈希鍵不保留順序輸出是很隨意的。

此命令:

awk 'arr[($1","$2","$3)]++==0 {print ($1","$2","$3)}' colors.txt 

檢查是否相同的組合物使用散列預先印刷,但是,它立即打印輸入如果arr[($1","$2","$3)]爲零。所以,沒有訂單保存。它更像是即時打印。

+0

非常感謝,perreal! – user2138595 2013-03-06 06:45:25

4

perreal解釋爲什麼順序被保存,我想談談一些這個成語的細微之處:

  • 如果在腳本中只出現一個陣列,我傾向於使用名稱hashh因爲它提醒自己它的類型。
  • 逗號分隔的數組下標按gawknawk已按預期工作,即h[$1,$2,$3]變爲h[$1 SUBSEP $2 SUBSEP $3]。默認值SUBSEP\0340x1c
  • 我發現!h[...]++h[...]++==0更具可讀性,也許這就是我。
  • 我更喜歡使用OFS而不是直接打印,即$1=$1; print高於print ($1","$2","$3)

所有這些加在一起:

awk '!h[$1,$2,$3]++ { $1=$1; print }' OFS=',' colors.txt 
+1

在這種情況下,我將我的數組命名爲「可見」,以表示它被用於的內容(即測試索引是否曾被看到過)而不是表示它如何存儲的「哈希」。所以我會使用'!看到[$ 1,$ 2,$ 3] ++'但是nbd無論如何。 +1 for!array [index] ++和使用OFS。 – 2013-03-06 13:27:16

6

只是爲了好玩,一個可以將其合併成一個awkish:

awk '!A[$1=$1,$2,$3]++' OFS=, file 
+0

+1爲簡潔:) – 2013-03-06 11:33:23

+0

謝謝Radoulov :) – Scrutinizer 2013-03-08 02:12:51