BEGIN { level = 0; printf( "{\"networks\":[" ); } /^$/ { nl = 1; } /^\tnetwork/ && level == 3 { printf( "}" ); level = 2; first = 1; } /^\tnetwork/ && level == 2 { printf( "]" ); level = 1; first = 1; } /^\tnetwork/ && level == 1 && nl == 1 { printf( "},{" ); first = 1; } /^\tnetwork/ && level == 0 { printf( "{" ); level = 1; first = 1; } /^$/ && level == 1 { printf( "\"stations\":[" ); level = 2; first = 1; } /^\t\tstation/ && level == 3 && nl == 1 { printf( "},{" ); first = 1; } /^\t\tstation/ && level == 2 { printf( "{" ); level = 3; first = 1; } /^\tnetwork/ { gsub(/network->/, "", $1); printf( "\"%s\":\"%s\",", $1, $3 ); first = 0; } /^\t\tstation/ { gsub(/station->/, "", $1); printf( "%s\"%s\":\"%s\"", first ? "" : ",", $1, $3 ); first = 0; } /^..*$/ && nl == 1 { nl = 0; } END { if( level == 3 ) { printf( "}" ); level = 2; }; if( level == 2 ) { printf( "]" ); level = 1; }; if( level == 1 ) { printf( "}" ); level = 0; }; printf( "]}\n" ); }