Использование команды awk с массивом для преобразования строки в столбец - PullRequest
0 голосов
/ 19 июня 2020

Доброе утро,

Помощь в создании файла, содержащего несколько строк, будет столбцом.

файл movimenta.txt

data             medicine         value
====             =======         =====
01.01.2019 01:00   m1             1
01.01.2019 02:00   m1             2
01.01.2019 03:00   m1             5
01.01.2019 04:00   m1             6
01.01.2019 01:00   m2             12
01.01.2019 02:00   m2             22
01.01.2019 03:00   m2             52
01.01.2019 04:00   m2             62
01.01.2019 01:00   m3             13
01.01.2019 02:00   m3             23
01.01.2019 03:00   m3             53
01.01.2019 03:00   m3             63

файл data.txt (сгруппирован )

data
====
01.01.2019 01:00   
01.01.2019 02:00   
01.01.2019 03:00   
01.01.2019 04:00 

файл medic.txt (сгруппирован)

remedio
=======
m1
m2
m3

** сложность сборки файла ниже **** columnar.txt (это будет соединение три файла, в которых файл data.txt будет содержать плюс строка в файле movimenta.txt будет столбцом в этом файле)

data                   m1      m2    m3
01.01.2019 01:00       1       12    13
01.01.2019 02:00       2       22    23
01.01.2019 03:00       5       52    53
01.01.2019 04:00       6       62    63

Примечание. Файл movimenta.txt - это динамический c, может иметь больше лекарств в вашем следующем поколении, и у вас может быть лекарство m4, m5, m6, m7, и т. д. c и c

1 Ответ

0 голосов
/ 24 июня 2020

Вам действительно нужны файлы data и medicine? Или достаточно показать только дату / время и лекарства, перечисленные в файле movimenta? Вот сценарий, который дает вам желаемый формат вывода, основанный только на одном файле в одном:

#!/usr/bin/awk -f

BEGIN {FS = "   *m?";}

NR > 2 {
    listOfDt[$1] = 1;
    sumData[$1,$2] = $3;
    if (max < $2) {max = $2;}
}

END {
    printf("%-16s","data");
    for (i = 1; i <= max; i++) {printf("%6s","m" i);}
    print "";

    for (dt in listOfDt) {
        line = sprintf("%-16s",dt);
        for (i = 1; i <= max; i++) {
            line = line sprintf("%6d",sumData[dt,i]);
        }
        print line | "sort";
    }
}

Если имя файла выше medicine-summary, вы должны использовать его следующим образом:

medicine-summary movimenta.txt

Основываясь на данных выше, он выводит

data                m1    m2    m3
01.01.2019 01:00     1    12    13
01.01.2019 02:00     2    22    23
01.01.2019 03:00     5    52    63
01.01.2019 04:00     6    62     0

(вы не включили запись для m3 в 04:00 в пример файла movimenta).

Обратите внимание на использование в качестве разделителя полей «не менее 2 пробелов плюс 0 или 1 буква m».

Для строк 2+ файла хранится список различных значений даты / времени, а также значение для каждого лекарства в эту дату / время и самый большой идентификатор лекарства.

В блоке END он печатает каждую отметку даты / времени, представленную в файле, вместе со значениями для каждого лекарства, представленного в файле , передавая вывод в команду UNIX sort, чтобы данные были представлены в хронологическом порядке (но только если все данные относятся к одному и тому же месяцу - лучше форматировать даты как yyyy-mm-dd HH:MM, чтобы упростить сортировку и избежать путаница относительно того, существует ли g формат: dd.mm.yyyy или mm.dd.yyyy).

То, что этот не отображает , - это

  • любое значение даты / времени из data файл, который не представлен в movimenta файле
  • идентификаторы лекарств из файла medicine, которые больше самого большого, появляющегося в moviementa файле
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...