Использование awk для строк с разным количеством столбцов - PullRequest
1 голос
/ 08 июля 2019

У меня есть следующая информация, напечатанная в терминале, и как вы можете видеть количество столбцов в первой и второй строках

Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1  2,526.9 MiB    317.1 GiB  0.008  CRC64   rar.stadium.trace.xz

Итак, если я использую awk '{print $3 "\t" $4}', я получу

Compressed  Uncompressed
2,526.9 MiB

Это не то, что я хочу.есть идеи?

Ответы [ 2 ]

4 голосов
/ 08 июля 2019

Используйте параметр FIELDWIDTHS с gnu awk, чтобы установить ширину каждого поля следующим образом:

xz -l t.xz | awk '{print $3"\t"$4}' FIELDWIDTHS="5 8 13 13 7 7 99"
   Compressed    Uncompressed
     79.7 MiB       553.9 MiB
  2,526.9 MiB       317.1 GiB

Редактировать: для последнего файла задано значение 99 для обработки длинного имени файла, если это необходимо
Edit2: чтобы лучше обрабатывать пространство и длину поля
Edit3: FIELDWIDTHS="5 8 13 13 7 7 *" можно использовать.

2 голосов
/ 08 июля 2019

Если вы хотите использовать GNU awk, вы можете проанализировать первую строку, чтобы определить FIELDWIDTHS:

awk '(NR==1){ for(i=1;i<=NF;++i) {match($0," *"$i); f=f" "RLENGTH};
              FIELDWIDTHS=f; $0=$0}
     {print $3,$4}'

См. комментарий EdMorton для улучшения вышеперечисленного ипричина:

Если у вас нет доступа к GNU awk, вы можете сделать вывод xz легко анализируемым с помощью режима робота:

Режим роботаактивируется с помощью опции --robot.Это облегчает анализ выходных данных xz другими программами.В настоящее время --robot поддерживается только вместе с --version, --info-memory и --list.В будущем он будет поддерживаться для сжатия и распаковки.

xz --robot --list использует вывод с разделением табуляцией .В первом столбце каждой строки есть строка, которая указывает тип информации, найденной в этой строке:

Для одного файла вас интересует строка file:

Столбцы строк файла:

Количество потоков в файле Общее количество блоков в потоке (ах) Сжатый размер файла Несжатый размер файла Коэффициент сжатия, например 0,123.Если отношение превышает 9,999, вместо отношения отображаются три черты (---). Список имен проверки целостности через запятую.Следующие строки используются для известных типов проверки: None, CRC32, CRC64 и SHA-256.Для неизвестных типов проверки используется Unknown-N, где N - это идентификатор проверки в виде десятичного числа (одна или две цифры). Общий размер заполнения потока в файле

Итак, что вас интересует, это:

xz --robot -l file.xz | awk 'BEGIN{FS=OFS="\t"; print "Compressed", "Uncompressed"}/file/{print $4,$5}'

Если вы хотите, чтобы он был в удобочитаемом формате, вы можете использовать эту функцию в awk:

function tohuman(size, t,u,s) {
    split( "B KiB MiB GiB TiB PiB EiB ZiB YiB" , u, " ");
    t=size; s=1; while( t>1024 ){ t/=1024; s++ }
    return sprintf("%6.1f %s", t, u[s]) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...