Arrays 这个AWK命令如何保持数组元素的顺序?
下面是一个名为“colors.txt”的文件中的RGB值列表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
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的使用。