这个AWK命令如何保留数组元素顺序?

时间:2013-03-06 06:14:09

标签: arrays awk

以下是名为'colors.txt'

的文件中的RGB值列表
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数组从

文件中获取5种独特的RGB组合
awk '{arr[($1","$2","$3)]} END {for (i in arr) print i}' colors.txt

这给出了:

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

3 个答案:

答案 0 :(得分:6)

只是为了好玩,人们可以把它组合成一个笨蛋:

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

答案 1 :(得分: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)]为零,它会立即打印输入。所以,没有订单保存。它更像是立即打印。

答案 2 :(得分: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