【问题标题】:Custom sorting in UnixUnix中的自定义排序
【发布时间】:2013-10-03 07:13:36
【问题描述】:

我想按特定顺序对以下数据进行排序。我尝试以不同的方式排序,但找不到任何解决方案。请帮忙。我是 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

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

【问题讨论】:

  • 你怎么知道method1:exit应该放在method1:entry之后?两个method1:exits 是相同的。 method1:entry 本身也是如此。您只想匹配具有相同 method 名称的 entryexits 对?
  • @moghaddam:是的,我只想将进入和退出与相同的方法名称配对。
  • 我认为没有办法直接在 shell 中使用命令和实用程序(如 sortsetawk)来执行此操作。您必须编写一些 python 或 perl 脚本才能做到这一点

标签: shell sorting unix


【解决方案1】:

您似乎只是想按方法名称排序,这是第一个以冒号分隔的字段。

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

-s 标志(稳定排序)防止sort 修改具有相同第一个字段的行的相对顺序。

【讨论】:

    【解决方案2】:

    试试这个:

    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. awk 步骤附加了另一列,以便我们可以对该列进行排序,以便我们有一个类似entry exit 的模式来匹配method1,输出是:

      1 方法 1 条目 2013.09.18.19.18.30
      2 方法1 条目 2013.09.18.19.18.30
      1方法1退出2013.09.18.19.18.30
      2方法1退出2013.09.18.19.18.30
      1 方法2 条目 2013.09.18.19.18.30
      1方法2退出2013.09.18.19.18.30
      1 方法3 条目 2013.09.18.19.18.30
      2方法3条目2013.09.18.19.18.30
      1方法3退出2013.09.18.19.18.30
      2方法3退出2013.09.18.19.18.30
      1 方法4 条目 2013.09.18.19.18.30
      1方法4退出2013.09.18.19.18.30
      1 方法5 条目 2013.09.18.19.18.30
      1方法5退出2013.09.18.19.18.30

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

      1 方法 1 条目 2013.09.18.19.18.30
      1方法1退出2013.09.18.19.18.30
      2 方法1 条目 2013.09.18.19.18.30
      2方法1退出2013.09.18.19.18.30
      1 方法2 条目 2013.09.18.19.18.30
      1方法2退出2013.09.18.19.18.30
      1 方法3 条目 2013.09.18.19.18.30
      1方法3退出2013.09.18.19.18.30
      2方法3条目2013.09.18.19.18.30
      2方法3退出2013.09.18.19.18.30
      1 方法4 条目 2013.09.18.19.18.30
      1方法4退出2013.09.18.19.18.30
      1 方法5 条目 2013.09.18.19.18.30
      1方法5退出2013.09.18.19.18.30

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

    【讨论】:

    • @snyder。输出在您的代码中以单行形式出现。有什么办法可以在不同的行中获得输出? wc -l 文件名返回 1。
    • @anz 试试这个cat file.txt | sed 's/method/\nmetthod/g'
    • 方法名不会是固定的,也可以是别的名字。
    • @anz 我已经在我的 shell 上测试了上面的命令,它给出了换行符。我用的是bash,你用的是哪个shell?
    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2011-06-06
    • 2014-06-30
    • 2010-10-27
    • 2013-04-09
    • 2019-12-06
    • 2010-12-24
    相关资源
    最近更新 更多