【问题标题】:Convert key:value to CSV file将键:值转换为 CSV 文件
【发布时间】:2020-02-24 02:17:54
【问题描述】:

我找到了以下 bash 脚本,用于将带有 key:value 信息的文件转换为 CSV 文件:

awk -F ":" -v OFS="," '
BEGIN { print "category","recommenderSubtype", "resource", "matchesPattern", "resource", "value" }
function printline() {
print data["category"], data["recommenderSubtype"], data["resource"], data["matchesPattern"], data["resource"], data["value"]
}
{data[$1] = $2}
NF == 0 {printline(); delete data}
END {printline()}
' file.yaml

但是执行之后,它只转换了第一组数据(只有前6行数据),像这样

category,recommenderSubtype,resource,matchesPattern,resource,value
COST,CHANGE_MACHINE_TYPE,instance-1,f1-micro,instance-1,g1-small

我的原始文件是这样的(1000行以上):

category:COST
recommenderSubtype:CHANGE_MACHINE_TYPE
resource:portal-1
matchesPattern:f1-micro
resource:portal-1
value:g1-small
category:PERFORMANCE
recommenderSubtype:CHANGE_MACHINE_TYPE
resource:old-3
matchesPattern:n1-standard-4
resource:old-3
value:n1-highmem-2

我缺少什么命令吗?

【问题讨论】:

  • 这可能根本不是 bash 脚本而是 awk 脚本吗?

标签: linux awk scripting


【解决方案1】:

原始脚本的问题在于以下几行:

NF == 0 {printline(); delete data}
END {printline()}

第一行表示:如果当前行没有记录,则调用 printline()。第二行表示处理完所有数据后调用printline()

输入数据格式的困难在于它并不能真正给出何时输出下一条记录的良好指示。在下文中,我只是将脚本更改为每六条记录输出一次数据。如果可能存在重复键,则输出标准可能是“填充所有字段”或需要稍微不同的编程。

#!/bin/sh -e
awk -F ":" -v OFS="," '
BEGIN {
    records_in = 0
    print "category","recommenderSubtype", "resource", "matchesPattern", "resource", "value"
}
{
    data[$1] = $2
    records_in++
    if(records_in == 6) {
        records_in = 0;
        print data["category"], data["recommenderSubtype"], data["resource"], data["matchesPattern"], data["resource"], data["value"]
    }
}
' file.yaml

其他推荐

  • 我刚刚删除了delete 语句,因为我不确定它的作用。 awk 的 POSIX 规范仅将其定义为删除单个数组元素。如果应该删除整个数组,建议对元素进行循环。但是,如果所有字段始终存在,那么也可以完全消除它。
  • 欢迎来到 SO(我也是新来的)。下次你问的时候,我建议标记问题awk 而不是bash,因为AWK 确实是这个问题中使用的脚本语言bash 只负责用合适的参数调用awk :)李>

【讨论】:

  • 伟大的粉丝!有用!从您的建议中学到了很多东西。
猜你喜欢
  • 2016-07-02
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2021-06-06
  • 2021-09-11
  • 2012-02-16
相关资源
最近更新 更多