我有一个包含以下行的文本文件。
Number: "472"
displayname: "jack holi"
Number: "392"
displayname: "david"
Number: "376"
displayname: "joly"
Number: "481"
displayname: "john doe"
....
如何按编号按升序排序,输出如下
Number: "376"
displayname: "joly"
Number: "392"
displayname: "david"
Number: "472"
displayname: "jack holi"
Number: "481"
displayname: "john doe"
答案 0 :(得分:3)
如果您仍在寻找(由于数组排序GNU)awk解决方案,您可以使用此脚本:
<强> script.awk 强>
BEGIN { ORS= RS="\n\n"
FS="[\n:]"
PROCINFO["sorted_in"] = "@ind_num_asc"
}
{ gsub( /"/, "", $2)
so[ $2 + 0 ] = $0 }
END { for( k in so ) print so[k] }
像awk -f script.awk yourfile
一样使用它。
<强>解释强>
RS
设置为两个换行符,以便number和displayname成为同一记录的成员FS
设置为newlline或:
,以便我们将数字,显示名称及其值分别设为字段$1,$3,$2,$4
so
的{{1}}下的$2
下,so
按[编号@ind_num_asc
排序)答案 1 :(得分:2)
Perl救援!
perl -e 'BEGIN { $/ = "" }
print for map $_->[1],
sort { $a->[0] <=> $b->[0] }
map [ /Number: "(\d+)"/, $_ ],
<>;' -- input.txt
BEGIN块打开段落模式,即钻石操作员在段落中读取文件,即由空行分隔的文本块。
它使用Schwartzian变换,即它将每个块映射到一对Number, block
,然后按数字对对进行排序,并将它们映射回块,现在顺序正确。
答案 2 :(得分:1)
这是一个稍微不同的看法...从输入文件中一次读取两行 GNU Parallel 并将它们放在一行上,对它们进行排序,然后再将它们分开:
parallel -L2 -ra input.txt echo | sort -n | perl -pe 's/" /"\n/; $_.="\n"'
答案 3 :(得分:0)
对于阵列扫描顺序没有gawk
的{{1}}的早期版本,您可以执行以下操作:
PROCINFO