我在终端上打印了以下信息,并且您可以看到第一行和第二行的列数
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
这不是我想要的。有什么主意吗?
答案 0 :(得分:4)
使用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 *"
。
答案 1 :(得分:2)
如果要使用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}'
有关上述内容的改进及其原因,请参见comment of EdMorton。
如果您无权访问GNU awk,则可以使用机械手模式轻松解析xz
的输出:
通过
--robot
选项激活了机器人模式。它使xz的输出更易于被其他程序解析。当前--robot
仅与--version
,--info-memory
和--list
一起受支持。将来将支持压缩和解压缩。
xz --robot --list
使用制表符分隔的输出。每行的第一列都有一个字符串,用于指示在该行上找到的信息的类型:
对于单个文件,您对file
行感兴趣:
文件行的列:
- 文件中的流数
- 流中的总块数
- 压缩文件大小
- 文件的未压缩大小
压缩比,例如0.123。如果比率超过9.999,则显示三个破折号(---)代替比率。- 用逗号分隔的完整性检查名称列表。以下字符串用于已知的检查类型:无,CRC32,CRC64和SHA-256。对于未知检查类型,使用Unknown-N, 其中N是支票ID,为十进制数字(一位或两位数字)。
- 文件中流填充的总大小
所以您感兴趣的是:
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]) }