Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 按两行分组对文本文件排序_Sorting_Awk_Sed - Fatal编程技术网

Sorting 按两行分组对文本文件排序

Sorting 按两行分组对文本文件排序,sorting,awk,sed,Sorting,Awk,Sed,我有一个具有以下结构的文件: 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   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   +
awk中的TIA:

$ 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   +
$awk'{
k=NR%2;a[k]=4;b[k]=0#存储比较值和
}#记录0和1
!(NR%2){即使我们比较
在awk中打印b[(a[0]>a[1])]或b[(a[0]:

$ 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   +
$awk'{
k=NR%2;a[k]=4;b[k]=0#存储比较值和
}#记录0和1
!(NR%2){即使我们比较

打印b[(a[0]>a[1])]或b[(a[0]这应该与
awk
一起使用:

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

这应该适用于
awk

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

应该有一个更简单的方法,但这是可行的

$ 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。

应该有一种更简单的方法,但这是可行的

$ 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。

尝试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 -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   +

$
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   -

$
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   -

$

差不多,但../1和../2的顺序颠倒了。u.uOk.几乎改变了,但../1和../2的顺序颠倒了。u.uOk.改变了,效果很好,唯一的细节是我不确定为什么,但我用命令u在每一行后面多了一行。u.uWorked nice,唯一的细节是我不确定为什么,但我用命令在每一行后面多了一行u.u工作得很好,还感谢您扩展了命令的解释!工作得很好,还感谢您扩展了命令的解释!非常好!感谢Perl示例。非常好!感谢Perl示例。