awk 将包含空字段的转置到 CSV 中



我试图处理awk,但对如何转置此数据并包含前两个字段的空值(即重复值)感到困惑。 即每个主机实例仅出现一次名称和 osType。

在附加行中具有空值会导致问题...有没有办法为以下行中的每个空重复主机名,例如"SDC1NM519"和操作系统类型"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 数据生成到每个"名称"(主机)和"ostype"(例如 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

希望有人能帮忙。

这个想法很简单。捕获看到的所有值。在捕获之前,只要输入行以"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 的事情困扰您,您可能会找到一种方法来避免重复的打印操作。

最新更新