awkを使ってフォーマットするのに助けが必要です。

awkを使ってフォーマットするのに助けが必要です。

入力データ

<Device>
      <dev_name>00002</dev_name>
      <Storage_Group>
        <Group_Info>
          <group_name>N/A</group_name>
    </Device>
    <Device>
      <dev_name>000BC</dev_name>
         <Storage_Group>
        <Group_Info>
          <group_name>sg_optimized</group_name>
          <group_name>sg_metro-nonir</group_name>
          <group_name>sh_m4i-pr-ixcem-a02</group_name>
          <group_name>sh_m4i-pr-ixcem-a01</group_name>
    </Device>
    <Device>
      <dev_name>000BD</dev_name>
          <group_name>sg_optimized</group_name>
         <dev_count>1</dev_count>
          <sg_count>0</sg_count>

          <group_name>sg_metro-nonir</group_name>
          <group_name>sh_m4i-pr-ixcem-b01</group_name>
          <group_name>sh_m4i-pr-ixcem-b02</group_name>
    </Device>
    <Device>
      <dev_name>000BE</dev_name>
          <group_name>sg_optimized</group_name>
    </Device>

出力

00002 N/A
000BC sg_optimized sg_metro-nonir sh_m4i-pr-ixcem-a02 sh_m4i-pr-ixcem-a01
000BD sg_optimized sg_metro-nonir sh_m4i-pr-ixcem-b01 sh_m4i-pr-ixcem-b02
000BE sg_optimized

これを使用していますが、最後のグループ名のみが印刷されます。以前のグループ名をスキップします。

VMAX_TDEV_SG_EXTRACT () {
cat $TMPLOGDIR/tdevsg.m4i-pr-llpmax-a01.map |awk '
function vmax_tdev_sg_extract(DEV_NAME,SG_NAME) {
        print DEV_NAME,SG_NAME;
}
BEGIN {
  FS = "[<>/]" ;
}
{
if ($0 ~ /dev_name>/) {
vmax_tdev_sg_extract(DEV_NAME,SG_NAME);
DEV_NAME = $3
SG_NAME=""
}
if ($0 ~ /\ygroup_name>\y/)  { SG_NAME=$3 }
}
END {vmax_tdev_sg_extract(DEV_NAME,SG_NAME)}
'
}

答え1

awk '
    BEGIN { FS="[<>]" }
    $2 == "dev_name"   { prt(); name = $3 }
    $2 == "group_name" { groups[++numGroups] = $3 }
    END { prt() }

    function prt(       i) {
        if ( name != "" ) {
            printf "%s%s", name, OFS
            for (i=1; i<=numGroups; i++) {
                printf "%s%s", groups[i], (i<numGroups ? OFS : ORS)
            }
            numGroups = 0
        }
    }
' file
00002 N/A
000BC sg_optimized sg_metro-nonir sh_m4i-pr-ixcem-a02 sh_m4i-pr-ixcem-a01
000BD sg_optimized sg_metro-nonir sh_m4i-pr-ixcem-b01 sh_m4i-pr-ixcem-b02
000BE sg_optimized

関連情報