Сортировка по возрастанию и убыванию по определенным блокам строк - PullRequest
1 голос
/ 29 февраля 2020

Я пытаюсь все время сортировать столбец 2, учитывая блоки из 5 строк. Например, Строки первого блока от 1 до 5 : сортировка столбца 2 в порядке возрастания Строки второго блока от 6 до 10 : сортировка столбца 2 в порядке убывания

Выполните эту операцию для всех файл

Входной файл

P 45683.00  39785.00 1 12 
P 45685.00  39785.00 1 12 
P 45687.00  39785.00 1 12 
P 45689.00  39785.00 1 12 
P 45691.00  39785.00 1 12 
P 45683.00  39795.00 1 12 
P 45685.00  39795.00 1 12 
P 45687.00  39795.00 1 12 
P 45689.00  39795.00 1 12 
P 45691.00  39795.00 1 12 
P 45683.00  39805.00 1 12 
P 45685.00  39805.00 1 12 
P 45687.00  39805.00 1 12 
P 45689.00  39805.00 1 12 
P 45691.00  39805.00 1 12 
P 45683.00  39815.00 1 12 
P 45685.00  39815.00 1 12 
P 45687.00  39815.00 1 12 
P 45689.00  39815.00 1 12 
P 45691.00  39815.00 1 12

желаемый вывод

P 45683.00  39785.00 1 12 
P 45685.00  39785.00 1 12 
P 45687.00  39785.00 1 12 
P 45689.00  39785.00 1 12 
P 45691.00  39785.00 1 12 
P 45691.00  39795.00 1 12 
P 45689.00  39795.00 1 12 
P 45687.00  39795.00 1 12 
P 45685.00  39795.00 1 12 
P 45683.00  39795.00 1 12 
P 45683.00  39805.00 1 12 
P 45685.00  39805.00 1 12 
P 45687.00  39805.00 1 12 
P 45689.00  39805.00 1 12 
P 45691.00  39805.00 1 12 
P 45691.00  39815.00 1 12 
P 45689.00  39815.00 1 12 
P 45687.00  39815.00 1 12 
P 45685.00  39815.00 1 12 
P 45683.00  39815.00 1 12 

попыток

awk '/45691.00/{"awk \\$0+0==\\$0 "file | getline x}
{print x"~"FNR"~"$0 | "sort -k2,2n "}'

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 29 февраля 2020

С GNU awk для sorted_in :

$ cat tst.awk
{ block[$2] = block[$2] $0 ORS }
!(NR % 5) { prt() }
END { prt() }

function prt(   i,j) {
    PROCINFO["sorted_in"] = "@ind_num_" ( (++inst) % 2 ? "asc" : "desc" )
    for (i in block) {
        printf "%s", block[i]
    }
    delete block
}

.

$ awk -f tst.awk file
P 45683.00  39785.00 1 12
P 45685.00  39785.00 1 12
P 45687.00  39785.00 1 12
P 45689.00  39785.00 1 12
P 45691.00  39785.00 1 12
P 45691.00  39795.00 1 12
P 45689.00  39795.00 1 12
P 45687.00  39795.00 1 12
P 45685.00  39795.00 1 12
P 45683.00  39795.00 1 12
P 45683.00  39805.00 1 12
P 45685.00  39805.00 1 12
P 45687.00  39805.00 1 12
P 45689.00  39805.00 1 12
P 45691.00  39805.00 1 12
P 45691.00  39815.00 1 12
P 45689.00  39815.00 1 12
P 45687.00  39815.00 1 12
P 45685.00  39815.00 1 12
P 45683.00  39815.00 1 12

Если вы действительно хотите печатать каждый раз, когда $3 меняется вместо каждых 5 тогда строки просто меняются:

{ block[$2] = block[$2] $0 ORS }
!(NR % 5) { prt() }

на:

$3 != prev { prt(); prev=$3 }
{ block[$2] = block[$2] $0 ORS }
1 голос
/ 29 февраля 2020

Ваш пример входного файла имеет следующие характеристики:

  • Строки 1-5,11-15, ... уже отсортированы
  • Строки 6-10,16 -20, ... перевернуты

Если это так, то следующей (совершенно некрасивой и не подлежащей повторному использованию, ахахах) команды должно быть достаточно:

< file1 sed -E 'N;N;N;N;N;N;N;N;N;s/^(.*)\n(.*)\n(.*)\n(.*)\n(.*)\n(.*)$/\1\n\6\n\5\n\4\n\3\n\2/' > file2.out
1 голос
/ 29 февраля 2020

Использование GNU awk и asort():

$ gawk '
function process() {
    asort(a,a,(o=="@ind_num_asc" ? o="@ind_num_desc" : o="@ind_num_asc"))
    for(i in a)
        print a[i]
    delete a
}
{
    a[$2]=a[$2] (a[$2]==""?"":ORS) $0
}
NR%5==0 {
    process()
}
END {
    process()
}' file

Вывод:

P 45683.00  39785.00 1 12 
P 45685.00  39785.00 1 12 
P 45687.00  39785.00 1 12 
P 45689.00  39785.00 1 12 
P 45691.00  39785.00 1 12 
P 45691.00  39795.00 1 12 
P 45689.00  39795.00 1 12 
P 45687.00  39795.00 1 12 
P 45685.00  39795.00 1 12 
P 45683.00  39795.00 1 12 
P 45683.00  39805.00 1 12 
P 45685.00  39805.00 1 12 
P 45687.00  39805.00 1 12 
P 45689.00  39805.00 1 12 
P 45691.00  39805.00 1 12 
P 45691.00  39815.00 1 12
P 45689.00  39815.00 1 12 
P 45687.00  39815.00 1 12 
P 45685.00  39815.00 1 12 
P 45683.00  39815.00 1 12 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...