awk 将空字段转置为 csv
awk transpose including empty fields into csv
我试图掌握 awk 的句柄,但对如何转置此数据并包括前两个字段的空值(即重复值)感到困惑。即 name 和 osType 对于每个主机实例只出现一次。
在附加行中有一个 null 会导致问题...有没有办法重复主机名,例如"SDC1NM519" 和 ostype "Windows" 对于以下行中的每个空值?
如果需要,了解如何 add/remove 额外的行也很方便。
这是我的数据:
>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 类型格式的每个 'name'(主机)和 'ostype'(例如 Windows)之后将行中的 $2 和 $3 数据生成到列中.我不能使用 (,:) 作为分隔符,因为数据包含它们(制表符或 ;)。
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 = }
\^osType\ { os = }
\^displayName\ { display = }
\^capacityInKB\ { capacity = }
\^consumedCapacityInKB\ { consumed = }
\^dpPoolID\ { pool = }
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[] = }
end {
print name ";" os ";" display ";" capacity ";" consumed ";" pool
}
您在问题中提到了 $2 和 $3。我想您会知道如何在必要时进行适当的替换。如果 DRY 事情困扰您,您可能会找到一种避免重复打印操作的方法。
我试图掌握 awk 的句柄,但对如何转置此数据并包括前两个字段的空值(即重复值)感到困惑。即 name 和 osType 对于每个主机实例只出现一次。
在附加行中有一个 null 会导致问题...有没有办法重复主机名,例如"SDC1NM519" 和 ostype "Windows" 对于以下行中的每个空值?
如果需要,了解如何 add/remove 额外的行也很方便。
这是我的数据:
>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 类型格式的每个 'name'(主机)和 'ostype'(例如 Windows)之后将行中的 $2 和 $3 数据生成到列中.我不能使用 (,:) 作为分隔符,因为数据包含它们(制表符或 ;)。
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 = }
\^osType\ { os = }
\^displayName\ { display = }
\^capacityInKB\ { capacity = }
\^consumedCapacityInKB\ { consumed = }
\^dpPoolID\ { pool = }
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[] = }
end {
print name ";" os ";" display ";" capacity ";" consumed ";" pool
}
您在问题中提到了 $2 和 $3。我想您会知道如何在必要时进行适当的替换。如果 DRY 事情困扰您,您可能会找到一种避免重复打印操作的方法。