Arhn - архитектура программирования

Сортировка файла по символам внутри блока данных

У меня есть следующий файл данных

10

AA 21.1218 14.7862 0.0566269
BB 26.5036 14.5513 19.975
CC 7.82448 1.30605 50.126899
AA 10.0179 4.3786 21.232036
BB 4.80236 4.23255 36.217038
CC 31.475 9.60365 7.237505
AA 8.39392 5.89571 10.30242
......
10

AA 21.1218 14.7862 0.0566269
BB 26.5036 14.5513 19.975
CC 7.82448 1.30605 50.126899
AA 10.0179 4.3786 21.232036
BB 4.80236 4.23255 36.217038
CC 31.475 9.60365 7.237505
AA 8.39392 5.89571 10.30242
......

Каждый блок данных состоит из 12 строк и повторяется 100 раз (общее количество файлов 1200). Отсюда я узнал, что могу сортировать внутри блока данных, но как мне справиться с первыми двумя строками каждого набора данных? Это строки заголовка, поэтому их необходимо сохранить.

Итак, я надеюсь иметь такой файл, как

10

AA 21.1218 14.7862 0.0566269
AA 10.0179 4.3786 21.232036
AA 8.39392 5.89571 10.30242
BB 26.5036 14.5513 19.975
BB 4.80236 4.23255 36.217038
CC 7.82448 1.30605 50.126899
CC 31.475 9.60365 7.237505
......
10

AA 21.1218 14.7862 0.0566269
AA 10.0179 4.3786 21.232036
AA 8.39392 5.89571 10.30242
BB 26.5036 14.5513 19.975
BB 4.80236 4.23255 36.217038
CC 7.82448 1.30605 50.126899
CC 31.475 9.60365 7.237505
......

я пытался

awk '{print int((NR-1)/12), $0}' file.txt | sort -nk1 > result

Но это не сработало для меня. Кроме того, как я могу работать с первыми двумя строками заголовка при сортировке по первым столбцам?

Спасибо

Лучший,

30.07.2015

Ответы:


1

Вы не указываете точно, каковы ваши критерии сортировки, но похоже, что вы хотите этого (я удалил бесполезные, запутывающие и усложняющие строки .... из ввода):

$ cat tst.awk
BEGIN { OFS="\t" }
NF==1 { idx=1; cnt++ }
NF==0 { idx=2 }
NF>1  { idx=3 }
{ print cnt, idx, $1, NR, $0 }

$ awk -f tst.awk file | sort -k1n -k2n -k3 -k4n | cut -f5-
10

AA 21.1218 14.7862 0.0566269
AA 10.0179 4.3786 21.232036
AA 8.39392 5.89571 10.30242
BB 26.5036 14.5513 19.975
BB 4.80236 4.23255 36.217038
CC 7.82448 1.30605 50.126899
CC 31.475 9.60365 7.237505
10

AA 21.1218 14.7862 0.0566269
AA 10.0179 4.3786 21.232036
AA 8.39392 5.89571 10.30242
BB 26.5036 14.5513 19.975
BB 4.80236 4.23255 36.217038
CC 7.82448 1.30605 50.126899
CC 31.475 9.60365 7.237505
30.07.2015
  • Спасибо. Жду книгу, которую вы мне порекомендовали :) Кстати, можно вопросы? Я вижу, что вы использовали idx и cnt++ для нумерации строк, но как вы справились с двумя строками заголовков? OFS=\t для заголовка? Кроме того, что делает cut -f5- в конце? 30.07.2015
  • OFS="\t" просто устанавливает разделитель полей вывода на тот же символ, который cut использует в качестве разделителя полей ввода (также известного как разделитель), поэтому сценарий awk добавляет 4 поля, которые будут использоваться для сортировки в начале каждой строки, а затем вырезание удаляет их снова после этого. Я бы порекомендовал вам просто посмотреть промежуточный вывод awk, а затем команды сортировки, чтобы лучше понять, что они и cut делают. Кроме того, добавьте несколько операторов печати в каждый из блоков действий awk, чтобы увидеть, что они делают и в каких строках ввода выполняется каждый из них. 30.07.2015

  • 2

    Я думаю, вам нужна стабильная сортировка по первому полю. Этот скрипт подойдет. Вам нужно закончить файл данных пустой строкой, иначе коду потребуется блок END для печати последнего блока содержимого.

    NF > 1  {                        # contents section
        a[$1, NR] = $0               # collect by key+line number (for stable sorting)
    }
    
    NF == 1 {                        # header line, just print and move
        print $0
    }
    
    NF == 0 {                        # end of contents marker
        n = asorti(a, b)             # sort the index values into array b
        for (i = 1; i <= n; i++) {
            print a[b[i]]            # print based on sorted indices
        }
        print $0                     # print empty line
    }
    
    30.07.2015
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..