Unix的。在行上对一组数据进行排序

时间:2014-10-22 17:42:04

标签: shell sorting unix

我有一组数据。我想按" Name ="排序。行并在每个" Name ="下面有正确的数据集。这可能吗 ?我查看了排序参考,但没有找到任何有关此物流的信息。我得到的数据量低于每个" Name ="可以是完全不同的。

我试图用man sort来找到解决这个问题的工具,但我似乎找不到这样的东西。先感谢您。我可能正在使用不正确的工具或命令。

我目前的数据集。我有数千行具有类似数据。

Name=Sally15 
Kitty Up Count 10 Active 1
Trex Up Count 5 Active 1
Name=Bob14
Bird Up Count 10 Active 5
Dog Up Count 2 Active 3 
Trex Up Count 5 Active 1
Name=Sally12 
Cow Up Count 5 Active 1
Trex Up Count 5 Active 2
Name=Bob13 
Cow Up Count 5 Active 1

欲望结果

Name=Bob13 
Cow Up Count 5 Active 1
Name=Bob14
Bird Up Count 10 Active 5
Dog Up Count 2 Active 3 
Trex Up Count 5 Active 1
Name=Sally12 
Cow Up Count 5 Active 1
Trex Up Count 5 Active 2
Name=Sally15 
Kitty Up Count 10 Active 1
Trex Up Count 5 Active 1

我的服务器上发生了什么

(admin)$ cat file
Name=Sally15
Kitty Up Count 10 Active 1
Trex Up Count 5 Active 1
Name=Bob14
Bird Up Count 10 Active 5
Dog Up Count 2 Active 3
Trex Up Count 5 Active 1
Name=Sally12
Cow Up Count 5 Active 1
Trex Up Count 5 Active 2
Name=Bob13
Cow Up Count 5 Active 1
[admins01:/script/users/admin]
(admin)$ gawk -v RS='Name=' '
    NR>1 {record[$1]=$0}
    END {
        PROCINFO["sorted_in"]="@ind_str_asc"
        for (key in record) printf "%s%s", RS, record[key]
    }
' file
Name=Sally12
Cow Up Count 5 Active 1
Trex Up Count 5 Active 2
Name=Bob13
Cow Up Count 5 Active 1
Name=Sally15
Kitty Up Count 10 Active 1
Trex Up Count 5 Active 1
Name=Bob14
Bird Up Count 10 Active 5
Dog Up Count 2 Active 3
Trex Up Count 5 Active 1

1 个答案:

答案 0 :(得分:1)

我打赌你的gawk版本是“老”。试试这个perl:

perl -0777 -ne 'print join "", sort split /^(?=Name=)/m' file

GNU awk:使用“Name =”作为记录分隔符,并按记录的第一个单词排序。

gawk -v RS='Name=' '
    NR>1 {record[$1]=$0} 
    END {
        PROCINFO["sorted_in"]="@ind_str_asc"
        for (key in record) printf "%s%s", RS, record[key]
    }
' file 

请注意,这将使用词典排序,因此“Bob10”将在“Bob1”和“Bob2”之间排序

测试:

$ cat file
Name=Sally15 
Kitty Up Count 10 Active 1
Trex Up Count 5 Active 1
Name=Bob14
Bird Up Count 10 Active 5
Dog Up Count 2 Active 3 
Trex Up Count 5 Active 1
Name=Sally12 
Cow Up Count 5 Active 1
Trex Up Count 5 Active 2
Name=Bob13 
Cow Up Count 5 Active 1

$ gawk -v RS='Name=' '
      NR>1 {record[$1]=$0} 
      END {
          PROCINFO["sorted_in"]="@ind_str_asc"
          for (key in record) printf "%s%s", RS, record[key]
      }
  ' file 
Name=Bob13 
Cow Up Count 5 Active 1
Name=Bob14
Bird Up Count 10 Active 5
Dog Up Count 2 Active 3 
Trex Up Count 5 Active 1
Name=Sally12 
Cow Up Count 5 Active 1
Trex Up Count 5 Active 2
Name=Sally15 
Kitty Up Count 10 Active 1
Trex Up Count 5 Active 1