【问题标题】:awk transpose including empty fields into csvawk 转置包括空字段到 csv
【发布时间】:2015-03-06 04:16:31
【问题描述】:

我正在尝试处理 awk,但对如何转置这些数据并包括前两个字段的空值(即重复值)感到困惑。即 name 和 osType 对于每个主机实例只出现一次。

在附加行中有 null 会导致问题...有没有办法重复主机名,例如"SDC1NM519" 和 ostype "Windows" 为以下行中的每个空值?

如果需要,了解如何添加/删除其他行也很方便。

这是我拥有的数据:

>cat tmp2.txt |pg
name    SDC1NM519
osType  Windows
displayName     00:60:04
capacityInKB    1,048,576
consumedCapacityInKB    43,008
dpPoolID        10
displayName     00:60:08
capacityInKB    1,335,885,824
consumedCapacityInKB    370,944,000
dpPoolID        10
displayName     00:F0:1A
capacityInKB    102,400
consumedCapacityInKB    43,008
dpPoolID        10
name    SDC1NM518
osType  Windows
displayName     00:00:18
capacityInKB    78,643,200
consumedCapacityInKB    3,655,680
dpPoolID        30

我需要能够以 csv 类型格式将行中的 $2 和 $3 数据生成到每个“名称”(主机)和“操作系统类型”(例如 Windows)之后的列中。我不能使用 (,:) 作为分隔符,因为数据包含它们,所以(制表符或;)。

name;osType;displayName;capacityInKB;consumedCapacityInKB;dpPoolID
SDC1NM519;Windows;00:60:04;1,048,576;43,008;10
SDC1NM519;Windows;00:60:08;1,335,885,824;370,944,000;10
SDC1NM519;Windows;00:60:64;1,048,576;86,016;10
SDC1NM519;Windows;00:FE:03;1,048,576;43,008;10
SDC1NM518;AIX;00:FE:02;1,048,576;43,008;10
SDC1NM518;AIX;00:FE:03;1,048,576;43,008;10
SDC1NM518;AIX;00:F0:1A;102,400;43,008;10
SDC1NM518;AIX;00:00:18;78,643,200;3,655,680;30

希望有人能提供帮助。

【问题讨论】:

    标签: csv awk null transpose


    【解决方案1】:

    这个想法很简单。捕获所有可见的值。在捕获之前,只要输入行以“displayName”开头(第一次除外)以及捕获完成后的最后,就会打印输出行。

    begin { print "name;osType;displayName;capacityInKB;consumedCapacityInKB;dpPoolID" }
    
    \^displayName\ && displayName != "" {
        print name ";" os ";" display ";" capacity ";" consumed ";" pool
    }
    
    \^name\                 { name     = $2 }
    \^osType\               { os       = $2 }
    \^displayName\          { display  = $2 }
    \^capacityInKB\         { capacity = $2 }
    \^consumedCapacityInKB\ { consumed = $2 }
    \^dpPoolID\             { pool     = $2 }
    
    end {
        print name ";" os ";" display ";" capacity ";" consumed ";" pool
    }
    

    或者您可以使用数组并以更简单的模式获取值:

    begin { print "name;osType;displayName;capacityInKB;consumedCapacityInKB;dpPoolID" }
    
    \^displayName\ && a["displayName"] != "" {
        print a["name"] ";"
              a["os"] ";"
              a["displayName"] ";"
              a["capacityInKB"] ";"
              a["consumedCapacityInKB"] ";"
              a["dbPoolID"]
    }
    
    { a[$1] = $2 }
    
    end {
        print name ";" os ";" display ";" capacity ";" consumed ";" pool
    }
    

    您在问题中提到了 $2 和 $3。我想你会知道如何在必要时进行适当的替换。如果 DRY 问题困扰您,您可能会找到一种避免重复打印操作的方法。

    【讨论】:

    • 谢谢肖恩,我得试一试,我会告诉你进展如何。
    • 嗨 Shawn .. 抱歉延迟响应,但这似乎不起作用,但更有可能是我的实现而不是您的代码。我在哪里引用数据文件?或者我是否将其放在获取数据的命令之后。如果是这样,我将如何将它“>>”输出到文件中?直接在“end {} >> ouput.txt”语句之后??
    • 最简单的通常是在命令行重定向标准输出。我认为 awk 的一些实现也有一个输出文件的参数。您也可以在脚本内的打印语句中执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多