1

这是一个名为“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  

保留顺序。这究竟是如何工作的?我在这里找到了第二个命令版本

4

3 回答 3

6

只是为了好玩,可以把它组合成一个尴尬的:

awk '!A[$1=$1,$2,$3]++' OFS=, file
于 2013-03-06T09:37:33.517 回答
4

perreal已经解释了为什么要保留这个顺序,我想谈谈这个成语的一些细节:

  • 如果脚本中只出现一个数组,我倾向于使用名称hashh为它来提醒自己它的类型。
  • 逗号分隔的数组下标已经在gawkand中按预期工作nawk,即h[$1,$2,$3]变为h[$1 SUBSEP $2 SUBSEP $3]. SUBSEP默认值为\0340x1c
  • 我发现!h[...]++比 更具可读性h[...]++==0,也许这只是我。
  • 我更喜欢使用OFS过度显式打印,即$1=$1; printover print ($1","$2","$3).

所有这些加在一起:

awk '!h[$1,$2,$3]++ { $1=$1; print }' OFS=',' colors.txt
于 2013-03-06T09:21:16.993 回答
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)]为零,它会立即打印输入。因此,没有订单保存。它更像是立即打印。

于 2013-03-06T06:21:30.177 回答