首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对列数不同的行使用awk

对列数不同的行使用awk
EN

Stack Overflow用户
提问于 2019-07-08 07:48:52
回答 2查看 355关注 0票数 1

我在终端中打印了以下信息,如您所见,第一行和第二行的列数

代码语言:javascript
复制
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}',我会得到

代码语言:javascript
复制
Compressed  Uncompressed
2,526.9 MiB

这不是我想要的。知道吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-08 08:40:18

使用FIELDWIDTHS参数和gnu awk设置每个字段的宽度,如下所示:

代码语言:javascript
复制
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 *"

票数 4
EN

Stack Overflow用户

发布于 2019-07-08 08:30:26

如果要使用GNU,可以解析第一行以确定FIELDWIDTHS

代码语言:javascript
复制
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行感兴趣:

文件行的列:

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

所以你感兴趣的是:

代码语言:javascript
复制
xz --robot -l file.xz | awk 'BEGIN{FS=OFS="\t"; print "Compressed", "Uncompressed"}/file/{print $4,$5}'

如果您希望它以人类可读的格式,可以在awk中使用此函数:

代码语言:javascript
复制
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]) }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56930481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档