如何按段

时间:2017-02-12 09:56:36

标签: awk sed grep

我有一个包含以下行的文本文件。

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"

4 个答案:

答案 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成为同一记录的成员
  • Fiedld分隔符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