在 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