libertyforall2
asked on
Overwriting part of one file with part of another file using unix script or perl
Ok. I have one file that is updated with new numbers and I need to copy the data from file 1 and replace part of file 2 with the new numbers in file 1. I have attached file1 & file2 in their entirety. Basically if I have this below
2.4583E+07
1.3956E+03
5.39583E+07
1.2583E+05
5.39583E+07
4.3933E+05
5.39583E+06
7.1183E+07
1.07917E+08
4.85625E+09
1.3E+08
4.3E+08
7.5E+33
2.3E+08
4.3E+07
3.2E+05
2.3E+07
5.3E+08
4.6E+06
2.7E+10
The script needs to search for the part of the script below then replace only the data in column 5 (I believe its 5 but perhaps the script should check for the first characters that contain E+) with the new data above but only the portion above. Nothing else needs to be changed.
echo "19.39 -155.100 50.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.101 100.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.102 150.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.103 170.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.104 190.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.105 210.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.106 230.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.107 250.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.108 270.0 1.07917E+08 300.0" >>CONTROL
echo "19.39 -155.109 300.0 4.85625E+09 300.0" >>CONTROL
echo "19.401391 -155.280640 50.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.280740 150.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.280840 300.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.280940 350.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281040 400.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281140 450.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281240 550.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281340 600.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281440 650.0 4.6E+08 100.0" >>CONTROL
echo "19.401391 -155.281540 700.0 2.07E+10 100.0" >>CONTROL
file1.txt
file2.txt
2.4583E+07
1.3956E+03
5.39583E+07
1.2583E+05
5.39583E+07
4.3933E+05
5.39583E+06
7.1183E+07
1.07917E+08
4.85625E+09
1.3E+08
4.3E+08
7.5E+33
2.3E+08
4.3E+07
3.2E+05
2.3E+07
5.3E+08
4.6E+06
2.7E+10
The script needs to search for the part of the script below then replace only the data in column 5 (I believe its 5 but perhaps the script should check for the first characters that contain E+) with the new data above but only the portion above. Nothing else needs to be changed.
echo "19.39 -155.100 50.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.101 100.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.102 150.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.103 170.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.104 190.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.105 210.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.106 230.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.107 250.0 5.39583E+07 300.0" >>CONTROL
echo "19.39 -155.108 270.0 1.07917E+08 300.0" >>CONTROL
echo "19.39 -155.109 300.0 4.85625E+09 300.0" >>CONTROL
echo "19.401391 -155.280640 50.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.280740 150.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.280840 300.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.280940 350.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281040 400.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281140 450.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281240 550.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281340 600.0 2.3E+08 100.0" >>CONTROL
echo "19.401391 -155.281440 650.0 4.6E+08 100.0" >>CONTROL
echo "19.401391 -155.281540 700.0 2.07E+10 100.0" >>CONTROL
file1.txt
file2.txt
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
I would use Perl as per attachment ...
#! perl
# Script arguments are NEW_DATA_FILE and FILE_TO_UPDATE
# Open new data file
open( INPUT_FH, $ARGV[0] ) ||
die "Failed to open '$ARGV[0]' for reading: $!";
my @new_data = <INPUT_FH>;
close( INPUT_FH );
chomp( @new_data);
# Open existing data file and process each line
open( INPUT_FH, $ARGV[1] ) ||
die "Failed to open '$ARGV[1]' for reading: $!";
my @old_data = <INPUT_FH>;
close( INPUT_FH );
my $data_idx = 0;
foreach ( @old_data ) {
# Replace the measurement
s/(.*)(\s+)([\d.]+E\+[\d]+)(\s.*)/$1$2${new_data[$data_idx++]}$4/ unless $data_idx == scalar(@new_data);
}
# Rewrite existing data file
open( OUTPUT_FH, '>' . $ARGV[1] ) ||
die "Failed to open '$ARGV[1]' for overwrite: $!";
foreach ( @old_data ) {
print( OUTPUT_FH $_ );
}
close( OUTPUT_FH );
ASKER