将awk用于具有不同列数的行

时间:2019-07-08 07:48:52

标签: awk

我在终端上打印了以下信息,并且您可以看到第一行和第二行的列数

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 个答案:

答案 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行感兴趣:

  

文件行的列:

     
      
  1. 文件中的流数
  2.   
  3. 流中的总块数
  4.   
  5. 压缩文件大小
  6.   
  7. 文件的未压缩大小
  8.   压缩比,例如0.123。如果比率超过9.999,则显示三个破折号(---)代替比率。   
  9. 用逗号分隔的完整性检查名称列表。以下字符串用于已知的检查类型:无,CRC32,CRC64和SHA-256。对于未知检查类型,使用Unknown-N,                 其中N是支票ID,为十进制数字(一位或两位数字)。
  10.   
  11. 文件中流填充的总大小
  12.   

所以您感兴趣的是:

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]) }
相关问题