сортировка текстового файла по группам из 2 строк - PullRequest
0 голосов
/ 31 января 2019

У меня есть файл со следующей структурой:

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   - 

Я хотел бы отсортировать его по 4-му полю (который в основном сортируется по последнему числу) в группах из двух строк по две строки ввыведите следующий результат:

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

Ответы [ 5 ]

0 голосов
/ 31 января 2019

awk + sort

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

$
0 голосов
/ 31 января 2019

Попробуйте 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   +

$
0 голосов
/ 31 января 2019

Это должно работать с awk:

awk '{if(p==""){p=$0;p4=$4} 
      else{
          if(p4>$4){print $0"\n"p}
          else{print p"\n"$0};p=p4=""
     }}' file
0 голосов
/ 31 января 2019

должен быть более простой способ, но это работает

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

создает идентификатор группы на основе первых групп полей, сортируя сначала его, а затем другое ключевое поле;удалить фиктивный идентификатор группы.

0 голосов
/ 31 января 2019

В 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   +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...