Если вы хотите использовать 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]) }