Я пытаюсь обобщить таблицу данных, которая меняется каждый день. Я уже суммировал таблицу, чтобы отображать только строки с записями, которые больше 30.
Однако в некоторые дни в исходной таблице нет записей больше 30. Когда это происходит, мне не нужен весь раздел, который пуст в сводке. Как мне тогда удалить весь заголовок для этих разделов?
В идеале, если нет записей во всех 5 разделах, не должно быть напечатано ни одной строки (или просто строка, которая говорит: «Нет: нет записи больше 30», как я пытался сделать)
Пример обобщенной таблицы с 5 разделами, summarised_output.txt:
=========================================================================================================
Month: Jun
Counter Name 06/04 18:00 06/04 17:00 06/04 16:00 06/04 15:00
=========================================================================================================
SYS.SYS.SYS.SYS.SYS.SYS. : 45 45 45 45
SYS.SYS.SYS.SYS.SYS.SYS. : 45 45 45 45
=========================================================================================================
Month: Jun
Counter Name 06/05 14:00 06/05 13:00 06/05 12:00 06/05 11:00
=========================================================================================================
SYS.SYS.SYS.SYS.SYS.SYS. : 45 45 45 45
SYS.SYS.SYS.SYS.SYS.SYS. : 45 45 45 45
=========================================================================================================
Month: Jun
Counter Name 06/05 10:00 06/05 09:00 06/05 08:00 06/05 07:00
=========================================================================================================
=========================================================================================================
Month: Jun
Counter Name 06/05 06:00 06/05 05:00 06/05 04:00 06/05 03:00
=========================================================================================================
SYS.SYS.SYS.SYS.SYS.SYS. : 45 45 45 45
SYS.SYS.SYS.SYS.SYS.SYS. : 45 45 45 45
=========================================================================================================
Month: Jun
Counter Name 06/04 18:00 06/04 17:00 06/04 16:00 06/04 15:00
=========================================================================================================
SYS.SYS.SYS.SYS.SYS.SYS. : 45 45 45 45
SYS.SYS.SYS.SYS.SYS.SYS. : 45 45 45 45
=========================================================================================================
Как видите, третий раздел пуст, потому что в файле original_output.txt нет записи выше 30. Но заголовок все еще там.
Мой сводный код (работал):
awk '$1=="Month:"||$1==""||$1=="Counter"||(index($1, "=")!=0)||$3>=30|| $4>=30 || $5>=30||$6>=30' original_output.txt>>summarised_output.txt
Моя попытка удалить заголовок (не работает):
touch summarised_output_temp.txt
awk '{if ($1=="Month:"||$1==""||$1=="Counter"||(index($1, "=")!=0)||$3>=30|| $4>=30 || $5>=30||$6>=30) print $0}' original_output.txt >> summarised_output_temp.txt
if (((wc -l < summarised_output_temp.txt)==42))
then
echo "None: there is no entry larger than 30" >> summarised_output.txt
else
cat output_7_temp.txt>>summarised_output.txt
fi
Ошибка, полученная за попытку:
line 3: ((: (wc -l output_7_temp.txt | awk {print $1})==42: syntax error: invalid arithmetic operator (error token is ".txt | awk {print $1})==42")
источник
Ответы:
Если у вас есть GNU
awk
, вы можете этот скрипт:Заголовок таблицы устанавливается как разделитель многострочных записей
RS
. Он состоит из двух 105=
символов с чем-то промежуточным.Переменная
RT
перехватывает разделитель записей для каждой записи и сохраняется в переменнойoRT
и печатается при следующей записи при условии, что есть какие-то элементы для печати (что ловится вместе сNF
).источник
gawk
вместоawk
. Вы также можете выяснить версию, которую вы используете с помощью командыawk --version
.GNU awk 4.2.1
и заголовок, включая строку06/05 10:00
, не появляется с этим скриптом awk.Создайте исполняемый скрипт test.awk, содержащий
и беги
"/ ^ SYS / {" может быть заменено чем-либо, что распознает строку данных.
источник
Эта проблема может быть решена с помощью Perl в этом направлении.
Код
Выход
объяснение
источник
Похоже на ответ Олив, возможно, немного проще:
Использование строки
=
s в качестве разделителя записей. Заголовок - это каждая четная запись. И «содержимое» не является пустым, если оно содержит непробельный символ.RT
является специфической переменной GNU awk, содержащей «Входной текст, который соответствует тексту, обозначенному RS, разделителем записей. Он устанавливается каждый раз, когда запись читается».источник