我有一个这样的输入文件:
pip install tensorflow --upgrade --force-reinstall
我对第二个字段感兴趣,例如,第二个字段的第二个元素是“ 240x151 + 140 + 624”。如果我们将第二个字段用作字段分隔符“ +”,则原始第二个字段中将有3个字段。我想要一个awk数组(在这种情况下为数组“ a”),该第二个字段首先按第三个子字段排序,然后按第二个子字段排序(其中,新的FS =“ +”)。
我正在使用下面的代码来做到这一点,它可以工作,但是我首先需要一个awk程序,然后需要管道进行排序,然后再次为第二个awk程序进行管道。
Objects (id: bounding-box centroid area mean-color):
0: 800x800+0+0 406.6,390.9 378792 srgb(0,0,0)
11: 240x151+140+624 259.5,699.0 36240 srgb(255,255,255)
6: 240x151+462+176 581.5,251.0 36240 srgb(255,255,255)
7: 240x151+87+257 206.5,332.0 36240 srgb(255,255,255)
8: 240x151+366+355 485.5,430.0 36240 srgb(255,255,255)
9: 240x151+77+448 196.5,523.0 36240 srgb(255,255,255)
10: 240x151+468+542 587.5,617.0 36240 srgb(255,255,255)
2: 178x59+223+65 311.5,94.0 10502 srgb(255,255,255)
3: 178x59+417+65 505.5,94.0 10502 srgb(255,255,255)
4: 178x59+611+65 699.5,94.0 10502 srgb(255,255,255)
1: 178x59+29+65 117.5,94.0 10502 srgb(255,255,255)
5: 110x16+255+63 309.5,182.5 1760 srgb(255,255,255)
如何在单个awk程序中获得排序的数组“ a”(没有两次管道),以便能够在END {}块中进行进一步处理?
提前感谢
答案 0 :(得分:2)
这里是GNU awk Using Predefined Array Scanning Orders with gawk的一个:
$ awk '
{
split($2,t,"+") # split $2 to tmp on +
a[t[3]][t[2]][NR]=$2 # most controlling key is the first...
} # etc, NR to make it unique
END {
PROCINFO["sorted_in"]="@ind_num_asc" # scanning order, see the link
for(i in a)
for(j in a[i])
for(k in a[i][j])
print a[i][j][k]
}' file
输出:
(id:
800x800+0+0
110x16+255+63
178x59+29+65
178x59+223+65
178x59+417+65
178x59+611+65
240x151+462+176
240x151+87+257
240x151+366+355
240x151+77+448
240x151+468+542
240x151+140+624
编辑:这可能是一个过大的杀伤力,它也可能起作用,但是现在做出决定或进行测试还为时过早。如果您进行了测试,请告诉我们,我们毕竟是一个社区:
$ awk '
{
split($2,t,"+") # for example: 240x151+140+624
a[t[3] "+" t[2] "+" NR]=$2 # key: t["624+140+3"]=240x151+140+624
}
END {
PROCINFO["sorted_in"]="@ind_num_asc"
for(i in a)
print a[i]
}' file
输出外观相同:
- -