Overwrite specific column in xml file with the specific column from adjacent line

I have an xml file dumped from rrd file, that I want to "patch" so the xml file doesn't contain any blank hole in the resulting graph of the rrd file.

Here is the file.

                        <!-- 2015-10-12 14:00:00 WIB / 1444633200 --> <row><v> 4.0419731265e+07 </v><v> 4.5045912770e+06 </v></row>
                        <!-- 2015-10-12 14:30:00 WIB / 1444635000 --> <row><v> 4.0918656141e+07 </v><v> 4.3788889519e+06 </v></row>
                        <!-- 2015-10-12 15:00:00 WIB / 1444636800 --> <row><v> 3.9170320634e+07 </v><v> 4.1575607379e+06 </v></row>
                        <!-- 2015-10-12 15:30:00 WIB / 1444638600 --> <row><v> 4.0042666683e+07 </v><v> NaN </v></row>
                        <!-- 2015-10-12 16:00:00 WIB / 1444640400 --> <row><v> 3.7800259425e+07 </v><v> 3.9889770705e+06 </v></row>
                        <!-- 2015-10-12 16:30:00 WIB / 1444642200 --> <row><v> 4.3428580982e+07 </v><v> 4.6176893128e+06 </v></row>
                        <!-- 2015-10-12 17:00:00 WIB / 1444644000 --> <row><v> NaN </v><v> NaN </v></row>
                        <!-- 2015-10-12 17:30:00 WIB / 1444645800 --> <row><v> 2.8175279532e+07 </v><v> 3.2702479666e+06 </v></row>
                        <!-- 2015-10-12 18:00:00 WIB / 1444647600 --> <row><v> NaN </v><v> NaN </v></row>
                        <!-- 2015-10-12 18:30:00 WIB / 1444649400 --> <row><v> 2.6849054218e+07 </v><v> NaN </v></row>
                        <!-- 2015-10-12 19:00:00 WIB / 1444651200 --> <row><v> 2.7128265520e+07 </v><v> 3.0079522711e+06 </v></row>
                        <!-- 2015-10-12 19:30:00 WIB / 1444653000 --> <row><v> 2.9454945311e+07 </v><v> 3.2169775579e+06 </v></row>
                        <!-- 2015-10-12 20:00:00 WIB / 1444654800 --> <row><v> 3.0942154265e+07 </v><v> 3.5790954829e+06 </v></row>
                        <!-- 2015-10-12 20:30:00 WIB / 1444656600 --> <row><v> 3.4192846130e+07 </v><v> 3.9272012512e+06 </v></row>
                        <!-- 2015-10-12 21:00:00 WIB / 1444658400 --> <row><v> 3.2414867732e+07 </v><v> 3.5966483780e+06 </v></row>
                        <!-- 2015-10-12 21:30:00 WIB / 1444660200 --> <row><v> 3.3603672868e+07 </v><v> 3.7096918887e+06 </v></row>
                        <!-- 2015-10-12 22:00:00 WIB / 1444662000 --> <row><v> 2.9880049291e+07 </v><v> 3.4207987623e+06 </v></row>
                        <!-- 2015-10-12 22:30:00 WIB / 1444663800 --> <row><v> 2.5531159221e+07 </v><v> 2.9017737347e+06 </v></row>
                        <!-- 2015-10-12 23:00:00 WIB / 1444665600 --> <row><v> 2.3767683540e+07 </v><v> 2.5850900701e+06 </v></row>
                        <!-- 2015-10-12 23:30:00 WIB / 1444667400 --> <row><v> 2.0764912116e+07 </v><v> 2.2501507280e+06 </v></row>
                        <!-- 2015-10-13 00:00:00 WIB / 1444669200 --> <row><v> 1.7792667886e+07 </v><v> 1.9121125517e+06 </v></row>
                        <!-- 2015-10-13 00:30:00 WIB / 1444671000 --> <row><v> 1.5628975308e+07 </v><v> 1.6763476712e+06 </v></row>
                        <!-- 2015-10-13 01:00:00 WIB / 1444672800 --> <row><v> 1.2069293261e+07 </v><v> 1.2963697129e+06 </v></row>
                        <!-- 2015-10-13 01:30:00 WIB / 1444674600 --> <row><v> NaN </v><v> NaN </v></row>
                        <!-- 2015-10-13 02:00:00 WIB / 1444676400 --> <row><v> 8.0396180932e+06 </v><v> 8.4440129683e+05 </v></row>
                        <!-- 2015-10-13 02:30:00 WIB / 1444678200 --> <row><v> NaN </v><v> 8.4456790646e+05 </v></row>
                        <!-- 2015-10-13 03:00:00 WIB / 1444680000 --> <row><v> 5.2890435516e+06 </v><v> 6.0423314244e+05 </v></row>
                        <!-- 2015-10-13 03:30:00 WIB / 1444681800 --> <row><v> 3.3841049411e+06 </v><v> 4.1918953556e+05 </v></row>

I want to copy corresponding column in the line before the line that contain 'NaN' value so all the 'NaN' value overwriten with the value of the column of the line before it.

The expected result will be :

                <!-- 2015-10-12 14:00:00 WIB / 1444633200 --> <row><v> 4.0419731265e+07 </v><v> 4.5045912770e+06 </v></row>
                        <!-- 2015-10-12 14:30:00 WIB / 1444635000 --> <row><v> 4.0918656141e+07 </v><v> 4.3788889519e+06 </v></row>
                        <!-- 2015-10-12 15:00:00 WIB / 1444636800 --> <row><v> 3.9170320634e+07 </v><v> 4.1575607379e+06 </v></row>
                        <!-- 2015-10-12 15:30:00 WIB / 1444638600 --> <row><v> 4.0042666683e+07 </v><v> 4.1575607379e+06 </v></row>
                        <!-- 2015-10-12 16:00:00 WIB / 1444640400 --> <row><v> 3.7800259425e+07 </v><v> 3.9889770705e+06 </v></row>
                        <!-- 2015-10-12 16:30:00 WIB / 1444642200 --> <row><v> 4.3428580982e+07 </v><v> 4.6176893128e+06 </v></row>
                        <!-- 2015-10-12 17:00:00 WIB / 1444644000 --> <row><v> 4.3428580982e+07 </v><v> 4.6176893128e+06 </v></row>
                        <!-- 2015-10-12 17:30:00 WIB / 1444645800 --> <row><v> 2.8175279532e+07 </v><v> 3.2702479666e+06 </v></row>
                        <!-- 2015-10-12 18:00:00 WIB / 1444647600 --> <row><v> 2.8175279532e+07 </v><v> 3.2702479666e+06 </v></row>
                        <!-- 2015-10-12 18:30:00 WIB / 1444649400 --> <row><v> 2.6849054218e+07 </v><v> 3.2702479666e+06 </v></row>
                        <!-- 2015-10-12 19:00:00 WIB / 1444651200 --> <row><v> 2.7128265520e+07 </v><v> 3.0079522711e+06 </v></row>
                        <!-- 2015-10-12 19:30:00 WIB / 1444653000 --> <row><v> 2.9454945311e+07 </v><v> 3.2169775579e+06 </v></row>
                        <!-- 2015-10-12 20:00:00 WIB / 1444654800 --> <row><v> 3.0942154265e+07 </v><v> 3.5790954829e+06 </v></row>
                        <!-- 2015-10-12 20:30:00 WIB / 1444656600 --> <row><v> 3.4192846130e+07 </v><v> 3.9272012512e+06 </v></row>
                        <!-- 2015-10-12 21:00:00 WIB / 1444658400 --> <row><v> 3.2414867732e+07 </v><v> 3.5966483780e+06 </v></row>
                        <!-- 2015-10-12 21:30:00 WIB / 1444660200 --> <row><v> 3.3603672868e+07 </v><v> 3.7096918887e+06 </v></row>
                        <!-- 2015-10-12 22:00:00 WIB / 1444662000 --> <row><v> 2.9880049291e+07 </v><v> 3.4207987623e+06 </v></row>
                        <!-- 2015-10-12 22:30:00 WIB / 1444663800 --> <row><v> 2.5531159221e+07 </v><v> 2.9017737347e+06 </v></row>
                        <!-- 2015-10-12 23:00:00 WIB / 1444665600 --> <row><v> 2.3767683540e+07 </v><v> 2.5850900701e+06 </v></row>
                        <!-- 2015-10-12 23:30:00 WIB / 1444667400 --> <row><v> 2.0764912116e+07 </v><v> 2.2501507280e+06 </v></row>
                        <!-- 2015-10-13 00:00:00 WIB / 1444669200 --> <row><v> 1.7792667886e+07 </v><v> 1.9121125517e+06 </v></row>
                        <!-- 2015-10-13 00:30:00 WIB / 1444671000 --> <row><v> 1.5628975308e+07 </v><v> 1.6763476712e+06 </v></row>
                        <!-- 2015-10-13 01:00:00 WIB / 1444672800 --> <row><v> 1.2069293261e+07 </v><v> 1.2963697129e+06 </v></row>
                        <!-- 2015-10-13 01:30:00 WIB / 1444674600 --> <row><v> 1.2069293261e+07 </v><v> 1.2963697129e+06 </v></row>
                        <!-- 2015-10-13 02:00:00 WIB / 1444676400 --> <row><v> 8.0396180932e+06 </v><v> 8.4440129683e+05 </v></row>
                        <!-- 2015-10-13 02:30:00 WIB / 1444678200 --> <row><v> 8.0396180932e+06 </v><v> 8.4456790646e+05 </v></row>
                        <!-- 2015-10-13 03:00:00 WIB / 1444680000 --> <row><v> 5.2890435516e+06 </v><v> 6.0423314244e+05 </v></row>
                        <!-- 2015-10-13 03:30:00 WIB / 1444681800 --> <row><v> 3.3841049411e+06 </v><v> 4.1918953556e+05 </v></row>

Nan value sometimes happen in cacti (cacti.net) because the script generated the rrd file sometimes not fast enough to generate the data.
I want to patch this NaN value so the graph will look nice and smooth without any blank gap.

I know a little about regex , script and perl. I know how to search specific line before/after regex. But this problem exceed my knowledge.

Thank you for any respons.

Something alomg this line?

awk '$9=="NaN" {sub ("NaN",last9)} $11=="NaN" {sub ("NaN", last11)} {last9=$9; last11=$11} 1' file
1 Like

:eek: Wow. Yes , exactly solve the problem.
I know awk , but this is new to me .

Thank you .