awk转置包括空字段到csv

时间:2015-03-06 04:16:32

标签: csv awk null transpose

我试图获取awk的句柄,但是我很难知道如何转置这些数据并包含前两个字段的空值,即重复该值。即name和osType仅对每个主机实例发生一次。

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

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

这是我的数据:

>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

我需要能够在每个'名称之后将行中的$ 2和$ 3数据生成列。 (主持人)和' ostype' (例如Windows)采用csv类型格式。我不能使用(,:)作为分隔符,因为数据包含它们(tab或;)。

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

希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:0)

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