【问题标题】:sort text file by groups of 2 lines按 2 行为一组对文本文件进行排序
【发布时间】:2019-06-25 03:51:29
【问题描述】:

我有一个结构如下的文件:

A   35  74  dsadasd/1   0   +
A   95  74  dsadasd/2   0   -
B   75  159 dsadasd/2   0   +
B   78  852 dsadasd/1   0   -
C   12  789 dsadasd/1   0   +
C   91  546 dsadasd/2   0   -
A   87  52  dsadasd/2   0   +
A   52  15  dsadasd/1   0   - 

我想按两行两行一组的第四个字段(基本上是按最后一个数字排序)进行排序,以输出以下结果:

A   35  74  dsadasd/1   0   +
A   95  74  dsadasd/2   0   -
B   78  852 dsadasd/1   0   -
B   75  159 dsadasd/2   0   +
C   12  789 dsadasd/1   0   +
C   91  546 dsadasd/2   0   -
A   52  15  dsadasd/1   0   - 
A   87  52  dsadasd/2   0   +

TIA

【问题讨论】:

    标签: sorting awk sed


    【解决方案1】:

    这应该适用于awk:

    awk '{if(p==""){p=$0;p4=$4} 
          else{
              if(p4>$4){print $0"\n"p}
              else{print p"\n"$0};p=p4=""
         }}' file
    

    【讨论】:

    • 差不多,但是../1和../2的顺序颠倒了。 u.u
    • 好的。改变了
    【解决方案2】:

    应该有一个更简单的方法,但这有效

    $ awk '{c+=p!=$1; p=$1; print c "\t" $0}' file | sort -k1,1 -k5 | cut -f2-
    
    A   35  74  dsadasd/1   0   +
    A   95  74  dsadasd/2   0   -
    B   78  852 dsadasd/1   0   -
    B   75  159 dsadasd/2   0   +
    C   12  789 dsadasd/1   0   +
    C   91  546 dsadasd/2   0   -
    A   52  15  dsadasd/1   0   -
    A   87  52  dsadasd/2   0   +
    

    根据第一个字段组创建一个组ID,首先按它排序,然后是另一个关键字段;删除虚拟组 ID。

    【讨论】:

      【解决方案3】:

      在 awk 中:

      $ awk  '{
          k=NR%2; a[k]=$4; b[k]=$0                     # store compare value and 
      }                                                #      record for 0 and 1
      !(NR%2) {                                        # on even we compare
          print b[(a[0]>a[1])] ORS b[(a[0]<=a[1])]     # and print the smaller first
      }' file
      A   35  74  dsadasd/1   0   +
      A   95  74  dsadasd/2   0   -
      B   78  852 dsadasd/1   0   -
      B   75  159 dsadasd/2   0   +
      C   12  789 dsadasd/1   0   +
      C   91  546 dsadasd/2   0   -
      A   52  15  dsadasd/1   0   - 
      A   87  52  dsadasd/2   0   +
      

      【讨论】:

      • 工作得很好,也感谢扩展命令的解释!
      【解决方案4】:

      试试 Perl.. 请注意,这会保留输入中的空格

       perl -0777 -ne ' while( /(.+?)\n(.+?)\n/gms ) { $a=$1;$b=$2; (split(/\s+/,$a))[3] gt (split(/\s+/,$b))[3] ? print "$b\n$a\n" : print "$a\n$b\n"  }'
      

      有输入

      $ cat angel.txt
      A   35  74  dsadasd/1   0   +
      A   95  74  dsadasd/2   0   -
      B   75  159 dsadasd/2   0   +
      B   78  852 dsadasd/1   0   -
      C   12  789 dsadasd/1   0   +
      C   91  546 dsadasd/2   0   -
      A   87  52  dsadasd/2   0   +
      A   52  15  dsadasd/1   0   -
      
      $ perl -0777 -ne ' while( /(.+?)\n(.+?)\n/gms ) { $a=$1;$b=$2; (split(/\s+/,$a))[3] gt (split(/\s+/,$b))[3] ? print "$b\n$a\n" : print "$a\n$b\n"  }' angel.txt
      A   35  74  dsadasd/1   0   +
      A   95  74  dsadasd/2   0   -
      B   78  852 dsadasd/1   0   -
      B   75  159 dsadasd/2   0   +
      C   12  789 dsadasd/1   0   +
      C   91  546 dsadasd/2   0   -
      A   52  15  dsadasd/1   0   -
      A   87  52  dsadasd/2   0   +
      
      $
      

      【讨论】:

      • 效果不错!感谢 Perl 示例。
      【解决方案5】:

      awk + ​​排序

      $ awk ' { $(NF+1)=int((NR+1)/2) } 1 ' angel.txt | sort -k7,7 -k4,4 | awk  ' {$NF=""}1 '
      A 35 74 dsadasd/1 0 +
      A 95 74 dsadasd/2 0 -
      B 78 852 dsadasd/1 0 -
      B 75 159 dsadasd/2 0 +
      C 12 789 dsadasd/1 0 +
      C 91 546 dsadasd/2 0 -
      A 52 15 dsadasd/1 0 -
      A 87 52 dsadasd/2 0 +
      
      $ cat angel.txt
      A   35  74  dsadasd/1   0   +
      A   95  74  dsadasd/2   0   -
      B   75  159 dsadasd/2   0   +
      B   78  852 dsadasd/1   0   -
      C   12  789 dsadasd/1   0   +
      C   91  546 dsadasd/2   0   -
      A   87  52  dsadasd/2   0   +
      A   52  15  dsadasd/1   0   -
      
      $
      

      【讨论】:

      • 工作得很好,唯一的细节是我不知道为什么,但我在你的命令 u.u 之后每行多了一行
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 2021-08-25
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      相关资源
      最近更新 更多