2

我想按特定顺序对以下数据进行排序。我尝试以不同的方式排序,但找不到任何解决方案。请帮忙。我是 Unix 的新手。:(

数据:-

method1:entry:2013.09.18.19.18.30
method1:exit:2013.09.18.19.18.30
method2:entry:2013.09.18.19.18.30
method2:exit:2013.09.18.19.18.30
method3:entry:2013.09.18.19.18.30
method4:entry:2013.09.18.19.18.30
method4:exit:2013.09.18.19.18.30
method1:entry:2013.09.18.19.18.30
method1:exit:2013.09.18.19.18.30
method3:exit:2013.09.18.19.18.30
method3:entry:2013.09.18.19.18.30
method5:entry:2013.09.18.19.18.30
method5:exit:2013.09.18.19.18.30
method3:exit:2013.09.18.19.18.30

期望的输出:-

method1:entry:2013.09.18.19.18.30
method1:exit:2013.09.18.19.18.30
method1:entry:2013.09.18.19.18.30
method1:exit:2013.09.18.19.18.30
method2:entry:2013.09.18.19.18.30
method2:exit:2013.09.18.19.18.30
method3:entry:2013.09.18.19.18.30
method3:exit:2013.09.18.19.18.30
method3:entry:2013.09.18.19.18.30
method3:exit:2013.09.18.19.18.30
method4:entry:2013.09.18.19.18.30
method4:exit:2013.09.18.19.18.30
method5:entry:2013.09.18.19.18.30
method5:exit:2013.09.18.19.18.30

排序应基于方法名称和“进入-退出”的出现。

4

2 回答 2

2

It appears you simply want to sort by method name, which is the first colon-delimited field.

sort -t: -s -k1,1 file.txt

The -s flag (stable sort) prevents sort from modifying the relative order of lines with the same first field.

于 2013-10-03T12:08:27.227 回答
1

尝试这个 :

sed -e 's/:/ /g' file.txt | sort |
awk 'BEGIN { var_entry="entry"; var_exit="exit"; flag="entry" }
    { if (flag == $2 && var_entry ==$2 ){
        i = 0; flag=var_exit; }
      else if (flag == $2 && var_exit == $2 ){
        i = 0; flag=var_entry; };
      i++ ; print i, $0 }' |
sort -t" " -k 2,2 -k 1,1 | sed 's/^[0-9]* //g'

这背后的逻辑是:

  1. sed -e 's/:/ /g 替换:为空格,因此分隔符是一致的。

  2. sort只需按method1列排序。

  3. awkstep 附加了另一列,以便我们可以对该列进行排序,以便我们有一个类似entry exitmatch的模式method1,输出是:

    1 method1 entry 2013.09.18.19.18.30
    2 method1 entry 2013.09.18.19.18.30
    1 method1 exit 2013.09.18.19.18.30
    2 method1 exit 2013.09.18.19.18.30
    1 method2 entry 2013.09.18.19.18.30
    1 method2 exit 2013.09.18.19.18.30
    1 method3 entry 2013.09.18.19.18.30
    2 method3 entry 2013.09.18.19.18.30
    1 method3 exit 2013.09.18.19.18.30
    2 method3 exit 2013.09.18.19.18.30
    1 method4 entry 2013.09.18.19.18.30 1 method4 exit
    2013.09.18.19.18.30 1 method5 entry
    2013.09 .18.19.18.30
    1 方法 5 退出 2013.09.18.19.18.30

  4. sort -t" " -k 2,2 -k 1,1:然后我们sortmethod1列(第二列),如果有冲突,我们在新添加的列即解决它们。第 1 列。输出是:

    1 method1 entry 2013.09.18.19.18.30
    1 method1 exit 2013.09.18.19.18.30
    2 method1 entry 2013.09.18.19.18.30
    2 method1 exit 2013.09.18.19.18.30
    1 method2 entry 2013.09.18.19.18.30
    1 method2 exit 2013.09.18.19.18.30
    1 method3 entry 2013.09.18.19.18.30
    1 method3 exit 2013.09.18.19.18.30
    2 method3 entry 2013.09.18.19.18.30
    2 method3 exit 2013.09.18.19.18.30
    1 method4 entry 2013.09.18.19.18.30
    1 method4 exit 2013.09.18.19.18.30 1 method5 entry
    2013.09 .18.19.18.30
    1 方法 5 退出 2013.09.18.19.18.30

  5. sed 's/^[0-9]* //g':我们删除了创建的额外列。

于 2013-10-03T08:33:14.430 回答