Вам действительно нужны файлы 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
файле