Arrays 这个AWK命令如何保持数组元素的顺序?

Arrays 这个AWK命令如何保持数组元素的顺序?,arrays,awk,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 25

下面是一个名为“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  
保持秩序。这到底是怎么回事?我找到了那个

这一行:

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]为零,它会立即打印输入。因此,没有秩序保护。它更像是即时打印。

这一行:

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]为零,它会立即打印输入。因此,没有秩序保护。它更像是即时打印。

佩雷尔已经解释了为什么保留顺序,我想谈谈这个习惯用法的一些细节:

如果脚本中只出现一个数组,我倾向于使用名称hash或h来提醒自己它的类型。 逗号分隔的数组下标在gawk和nawk中已按预期工作,即h[$1,$2,$3]变为h[$1 subsp$2 subsp$3]。SUBSEP的默认值为\034或0x1c。 我发现了!h[…]++比h[…]++==0可读性更强,也许这就是我。 我更喜欢使用OFS而不是显式打印,即$1=$1;打印超过打印$1、$2、$3。 所有这些加在一起:

awk '!h[$1,$2,$3]++ { $1=$1; print }' OFS=',' colors.txt
佩雷尔已经解释了为什么会保留秩序,我想谈谈这个成语的一些精妙之处:

如果脚本中只出现一个数组,我倾向于使用名称hash或h来提醒自己它的类型。 逗号分隔的数组下标在gawk和nawk中已按预期工作,即h[$1,$2,$3]变为h[$1 subsp$2 subsp$3]。SUBSEP的默认值为\034或0x1c。 我发现了!h[…]++比h[…]++==0可读性更强,也许这就是我。 我更喜欢使用OFS而不是显式打印,即$1=$1;打印超过打印$1、$2、$3。 所有这些加在一起:

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

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

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

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

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

在这种情况下,我将数组命名为seen,以表示它的用途,也就是说,测试是否以前见过索引,而不是哈希表示它的存储方式。所以我会用!看到[$1,$2,$3]++但无论哪种方式都是nbd+一个人!数组[index]++和OFS的使用。在这种情况下,我将我的数组命名为seen,以表示它的用途,即测试是否以前见过索引,而不是哈希表示它的存储方式。所以我会用!看到[$1,$2,$3]++但无论哪种方式都是nbd+一个人!数组[索引]++和OFS的使用。