AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 707870
Accepted
user185953
user185953
Asked: 2022-06-29 08:04:31 +0800 CST2022-06-29 08:04:31 +0800 CST 2022-06-29 08:04:31 +0800 CST

格式化为实时数据的列(管道)

  • 772

有没有办法对column通过管道传输的数据进行过滤?

我正在寻找一种方法来做类似的事情column -t,但无需等待输入结束,因此它适用于通过管道传输的实时数据。我知道我可以通过 强制固定宽度的列awk,但是每次格式更改时都需要进行太多设置。

PS:我认为模仿column -x不完整的数据是不可能的。我也认为column -t不可能在不完整的数据上完美复制。如果解决方案首先输出较窄的列,然后随着更多行的到达而扩展它们,则可以。

编辑:说明这不是缓冲问题的示例:

yes something | cat -n | tr -s '\t' ' ' | column -t
shell columns
  • 1 1 个回答
  • 44 Views

1 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2022-07-01T04:32:50+08:002022-07-01T04:32:50+08:00

    关键column -t在于它会根据每列中每个字段的最大值自动对齐列中的字段。

    如果您的输入包含

    a b
    a  b
    a bc
    

    它将输出:

    a  b
    a  b
    a  bc
    

    如果添加:

    xxxxx b
    

    输入线,输出变为:

    a      b
    a      b
    a      bc
    xxxxx  b
    

    column需要读取所有输入行以确定每列的宽度,并且在此之前无法开始输出任何内容。

    解决此问题的唯一方法是您知道或可以猜测每列的最大宽度。

    例如,如果您知道字段永远不会超过 10 个单元格,您可以执行以下操作:

    <input tr -s '[:blank:]' '[\t*]' | expand -t 12
    

    将输出格式化为 12 单元大列。

    (注意tr包括 GNU 在内的一些实现tr不支持多字节字符,而expand包括 GNU 在内的一些实现expand既不支持多字节字符也不支持零宽度或双宽度字符)

    对于宽度动态适应新输入宽度的列的解决方案,您可以执行以下操作:

    perl -Mopen=locale -MText::CharWidth=mbswidth -lae '
      for (0..$#F) {$l = mbswidth$F[$_]; $l[$_] = $l if $l > $l[$_]}
      print((map {sprintf "%-$l[$_]s  ", $F[$_]} (0..$#F-1)), $F[$#F])'
    

    例如,在 的输出上lorem -p 2 | fmt -w 40,给出:

    Rerum  aut  pariatur  nihil
    modi.  Exercitationem  ut
    animi.  Quibusdam       dolores
    voluptates  pariatur        vel
    tempora.    Adipisci        expedita  voluptate
    dolores     qui             consequatur.  Laboriosam
    eum         ea.             Quasi         ab            qui  harum
    repudiandae  consequatur     quasi
    
    Nobis        quia            nesciunt      laudantium.
    enim         exercitationem
    earum.       Pariatur        nesciunt
    maiores      natus           nemo          delectus.     Ut
    ad           voluptatem.     Consequatur   sint
    enim         sequi           aut           est           nihil.  Et     at
    

    或者仅重新格式化前 3 列:

    perl -Mopen=locale -MText::CharWidth=mbswidth -lne '
      @F = /(\S+)\s+(\S+)\s+(\S+)\s*(.*)/;
      for (0..$#F) {$l = mbswidth$F[$_]; $l[$_] = $l if $l > $l[$_]}
      print((map {sprintf "%-$l[$_]s  ", $F[$_]} (0..$#F-1)), $F[$#F])'
    

    给予:

    Sit  earum  voluptatem  cum adipisci aut
    commodi.  Quia   aut         eaque rerum nihil
    aperiam.  Dolor  quia        illo et. Quasi
    illum     est    aliquam     consequatur maiores
    voluptatibus.  Optio  consectetur  aliquid
    
    
    Aspernatur     omnis  ex           dolor nemo delectus
    sit            quia   ut.          Voluptatum voluptatibus
    suscipit       vel    quos.        Quo a at et non
    cumque         voluptate  dolorum      nostrum. Eos
    ex             est        deleniti     necessitatibus
    assumenda      provident  culpa.       Ut
    sed            et         labore       ullam voluptatum
    impedit.       Tempora    delectus     et rem dicta
    debitis        odit       dignissimos.
    
    • 2

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve