in reply to Preserving "Valid" Data?

Assuming your SATID sections are all the same length.

#!/usr/bin/perl # http://perlmonks.org/?node_id=1186932 use strict; use warnings; while(<DATA>) { s/SATID.{21}(?:(SIGNAL ..)|.{9})/ $1 ? $& : ' ' x length $& /ge; print; } __DATA__ Timestamp: 00:55:46 SATID 17 VAL1 49 VAL2 038 SIGNAL 39 SATID 18 S +ATID 17 VAL1 49 VAL2 038 SATID 19 VAL1 69 VAL2 015 SIGNAL NA + SATID 39 SATID 28 VAL1 36 VAL2 073 SIGNAL + 21

UPDATE: I think more test cases are needed.

Replies are listed 'Best First'.
Re^2: Preserving "Valid" Data?
by coding1227 (Novice) on Apr 04, 2017 at 05:33 UTC
    thanks tybalt89! This seems to work very well! =)

    Ok... one last question:
    Say I have a file containing the following data lines: Timestamp: 00:47:14 SATID 13 VAL1 28 VAL2 227 SIGNAL 37 + SATID 15 VAL1 22 VAL2 265 SIGNAL 30 SATID 16 VA +L1 22 VAL2 265 SIGNAL 30 Timestamp: 00:48:14 SATID 13 VAL1 28 VAL2 227 SIGNAL 37 + SATID 15 VAL1 22 VAL2 265 SIGNAL NA SATID 16 VA +L1 22 VAL2 265 SIGNAL 30 Timestamp: 00:49:14 SATID 14 VAL1 +22 VAL2 265 SIGNAL 30
    Can I use perl so that it will automatically "fill in" the missing cells with the ID of the SATID for its corresponding column, while filling in the VAL1, VAL2 and SIGNAL with "nan"?
    For instance, the desired output would be: Timestamp: 00:47:14 SATID 13 VAL1 28 VAL2 227 SIGNAL 37 SATID 14 VAL1 +nan VAL2 nan SIGNAL nan SATID 15 VAL1 22 VAL2 265 SIGNAL 30 SATID 16 +VAL1 22 VAL2 265 SIGNAL 30 Timestamp: 00:48:14 SATID 13 VAL1 28 VAL2 227 SIGNAL 37 SATID 14 VAL1 +nan VAL2 nan SIGNAL nan SATID 15 VAL1 22 VAL2 265 SIGNAL nan SATID 16 + VAL1 22 VAL2 265 SIGNAL 30 Timestamp: 00:49:14 SATID 13 VAL1 nan VAL2 nan SIGNAL nan SATID 14 VAL +1 22 VAL2 265 SIGNAL 30 SATID 15 VAL1 nan VAL2 nan SIGNAL nan SATID 1 +6 VAL1 nan VAL2 nan SIGNAL nan
    Thanks again! =)

      Try this. I changed two of the nan to just na to maintain column alignment.

      #!/usr/bin/perl # http://perlmonks.org/?node_id=1186932 use strict; use warnings; my $high = 0; while(<DATA>) { $high < $_ and $high = $_ for /SATID (\d\d)/g; # middle s/SATID (\d\d) .{17}SIGNAL \d\d \K {35}(?= SATID (\d\d))/SATID @{[ $1 + $2 >> 1]} VAL1 na VAL2 nan SIGNAL na/g; # beginning s/\d:\d\d:\d\d \K {35}(?= SATID (\d\d))/SATID @{[ $1 - 1]} VAL1 na VAL2 nan SIGNAL na/; # end while( /.*SATID (\d\d)/ and $1 < $high ) { my $nextnumber = $1 + 1; s/$/ SATID $nextnumber VAL1 na VAL2 nan SIGNAL na/; } print; } __DATA__ Timestamp: 00:47:14 SATID 13 VAL1 28 VAL2 227 SIGNAL 37 + SATID 15 VAL1 22 VAL2 265 SIGNAL 30 SATID 16 VA +L1 22 VAL2 265 SIGNAL 30 Timestamp: 00:48:14 SATID 13 VAL1 28 VAL2 227 SIGNAL 37 + SATID 15 VAL1 22 VAL2 265 SIGNAL NA SATID 16 VA +L1 22 VAL2 265 SIGNAL 30 Timestamp: 00:49:14 SATID 14 VAL1 +22 VAL2 265 SIGNAL 30
        thanks! It looks like it might work well =)