2013-03-06 90 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