我在终端中打印了以下信息,如您所见,第一行和第二行的列数
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这不是我想要的。知道吗?
发布于 2019-07-08 08:40:18
使用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 *"。
发布于 2019-07-08 08:30:26
如果要使用GNU,可以解析第一行以确定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,则可以使用机器人模式轻松地解析xz的输出:
使用
--robot选项激活机器人模式。它使xz的输出更容易被其他程序解析。目前,--robot只与--version、--info-memory和--list一起支持。它将在未来支持压缩和解压缩。xz --robot --list使用选项卡分隔的输出。每一行的第一列都有一个字符串,该字符串指示在该行上找到的信息类型:
对于单个文件,您对file行感兴趣:
文件行的列:
所以你感兴趣的是:
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]) }https://stackoverflow.com/questions/56930481
复制相似问题