如何将 bash 输出转换为 bash 表

如何将 bash 输出转换为 bash 表

在 bash 中运行程序后的输出如下所示(两行,:限制器,四列数据)

#003:BMW:11:36

#004:Audi:2:35

我想将其转换为这样的 bash 表

数字 ID 成本
#003 宝马 11 36
#004 奥迪 2 35

是否可以使用 sed/awk 来实现此目的?我的数据不是来自文件。

答案1

假设您想要将数据格式化为

| Number | Car  | ID | Cost |
| ------ | ---- | -- | ---- |
| #003   | BMW  | 11 |   36 |
| #004   | Audi |  2 |   35 |

命令csvlook来自csvkit如果您首先插入标题,则会为您执行此操作。

您可以通过编辑文件(或使数据生成器命令发出它们)来插入标题,Number:Car:ID:Cost在开头添加一行,或者您可以即时提供标题行:

$ { echo Number:Car:ID:Cost; cat file; } | csvlook
| Number | Car  | ID | Cost |
| ------ | ---- | -- | ---- |
| #003   | BMW  | 11 |   36 |
| #004   | Audi |  2 |   35 |

上面的csvlook命令检测到数据是一个 CSV 文档,使用:作为其字段分隔符(也可以使用 显式指定-d :),并生成格式化的表。

请注意,cat file可以被任何生成数据作为输出的命令替换。

最终输出csvlook是有效的 Markdown 代码,在该网站上,其呈现如下:

数字 ID 成本
#003 宝马 11 36
#004 奥迪 2 35

将输入视为 CSV 允许我们支持包含引号:字符的字段:

$ cat file
#003:BMW:11:36
#004:Audi:2:35
#005:Saab:99:"1:50"
$ { echo Number:Car:ID:Cost; cat file; } | csvlook
| Number | Car  | ID | Cost |
| ------ | ---- | -- | ---- |
| #003   | BMW  | 11 | 36   |
| #004   | Audi |  2 | 35   |
| #005   | Saab | 99 | 1:50 |

答案2

你可以使用:

process-generating-output | sed '1i Number:Car:ID:Cost\n' | column -s: -t

输出:

Number  Car   ID  Cost
#003    BMW   11  36
#004    Audi  2   35

我们使用 sed 命令插入一行1i,在其中放置列名称 - 用冒号分隔,就像列在“进程生成输出”中一样。然后通过column命令将所有内容进行管道传输以很好地对齐。

(感谢 @Frédéric Loyer 提供了插入列名称的更好方法!)

答案3

将输出流通过管道传输到下一行:

| column -ts: -o$'\t' -N Number,Car,ID,Cost

也许需要省略-o$'\t'( ) 选项。--output-separator

相关内容