Replace Stub Values In One Group Of Files With Actual Values From Another Group Of Files


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Replace Stub Values In One Group Of Files With Actual Values From Another Group Of Files
# 1  
Old 07-29-2019
Replace Stub Values In One Group Of Files With Actual Values From Another Group Of Files

I have two directories of files (new-config-files and old-config-files):

Code:
new-config-files/this-db/config.inc.php
new-config-files/that-db/config.inc.php
new-config-files/old-db/config.inc.php
new-config-files/new-db/config.inc.php
new-config-files/random-database/config.inc.php
etc.

old-config-files/this-db/config.inc.php
old-config-files/that-db/config.inc.php
old-config-files/old-db/config.inc.php
old-config-files/new-db/config.inc.php
old-config-files/random-database/config.inc.php
etc.

Example snippet of old file:
Code:
$cfg['Servers'][$i]['user'] = 'test-user';
$cfg['Servers'][$i]['password'] = 'test-user-password';
$cfg['Servers'][$i]['only_db'] = 'test-data';

Example snippet of new file:
Code:
$cfg['Servers'][$i]['user'] = 'DB-USER';
$cfg['Servers'][$i]['password'] = 'DB-PASSWORD';
$cfg['Servers'][$i]['only_db'] = 'DB-DATABASES';

I'd like to replace only the stub values (i.e., DB-USER, DB-PASSWORD, DB-DATABASES) in the new config files with the corresponding actual values (i.e., test-user, test-user-password, test-data) from the old config files.

It might also be good to know how to do this when there are no stub values, but only different values that should be replaced.
# 2  
Old 07-29-2019
Code:
for i in new-config-files/*/*                  # for list of files under new directory/subdirectory
do
   [[ -f ${i/new/old} ]] && {                                     # if same file name exists under new and old directories
      awk -F\' '                                                           # use awk with ' as field delimeter
      NR==FNR {val[$4]=$6; next}                       #  for first file read (old) store field 6 in var array stub key name (field 4)
      length(val[$4]) {$6=val[$4]}                        #  for second file read replace field 6 stored for the stub name if it exists
      1                                                                          # print line
      ' ${i/new/old} OFS=\' $i > $i.tmp                  # open old file new file (with ' as delimiter) redirect output to file with tmp extension
      mv -f $i.tmp $i                                                # move tmp extension file name to original file name (clobbers file)
   }
done

# end loop

note: make a couple of test directories to test.

Last edited by rdrtx1; 07-29-2019 at 08:30 PM.. Reason: added comments for explanation.
This User Gave Thanks to rdrtx1 For This Post:
# 3  
Old 07-29-2019
Quote:
Originally Posted by rdrtx1
Code:
for i in new-config-files/*/*
do
   [[ -f ${i/new/old} ]] && {
      awk -F\' 'NR==FNR {val[$4]=$6; next} length(val[$4]) {$6=val[$4]} 1' ${i/new/old} OFS=\' $i > $i.tmp
      mv -f $i.tmp $i
   }
done

note: make a couple of test directories to test.
This seems to work great, thank you!

Can you explain how it's working?
# 4  
Old 07-30-2019
Quote:
Originally Posted by rdrtx1
Code:
for i in new-config-files/*/*                  # for list of files under new directory/subdirectory
do
   [[ -f ${i/new/old} ]] && {                                     # if same file name exists under new and old directories
      awk -F\' '                                                           # use awk with ' as field delimeter
      NR==FNR {val[$4]=$6; next}                       #  for first file read (old) store field 6 in var array stub key name (field 4)
      length(val[$4]) {$6=val[$4]}                        #  for second file read replace field 6 stored for the stub name if it exists
      1                                                                          # print line
      ' ${i/new/old} OFS=\' $i > $i.tmp                  # open old file new file (with ' as delimiter) redirect output to file with tmp extension
      mv -f $i.tmp $i                                                # move tmp extension file name to original file name (clobbers file)
   }
done

# end loop

note: make a couple of test directories to test.
Thanks for the comments. I'm not understanding how the field 4 & 6 numbers are working -- how are these counted?

Assuming I have other lines in these files, will this replace those values too, or only where I have the stub values?
I'd like to only replace the stub values in this case. The old files may have lines that also exist in the new files, whose values I don't want to transpose. It seems to only have replaced the stub values ... how?

Last edited by spacegoose; 07-30-2019 at 12:19 AM..
# 5  
Old 07-30-2019
The field divider is a single quote ('). So field 4 is the stub name. To control which stubs to update, try using a control string. ex.:

Code:
update_stubs="user:password"

for i in new-config-files/*/*
do
   [[ -f ${i/new/old} ]] && {
      awk -F\' -v stubs="$update_stubs" '
      BEGIN {
         c=split(stubs, t_array, ":");
         for (i=1; i<=c; i++) update_stubs[t_array[i]]=t_array[i];
      }
      NR==FNR {if (length(update_stubs[$4])) val[$4]=$6; next;}
      length(val[$4]) {$6=val[$4];}
      1
      ' ${i/new/old} OFS=\' $i > $i.tmp
      mv -f $i.tmp $i
   }
done

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Replace values between 2 files

I want to replace the third and fourth lines of a 2nd file by the first two lines of a file. Input: file_1 file_1.line_1 file_1.line_2 file_2 file_2.line_1 <file_2.line_2_blank> file_2.line_3 file2.line_4 <file_2.line_5_blank> Output: file_2.line1 <file_2.line_2_blank>... (1 Reply)
Discussion started by: arpagon
1 Replies

2. Shell Programming and Scripting

Replace two values in a file with input from two different files

Hi, I was having the following issue cat input hello1, my name is unix.com. I am awesome. Hope you know this, hello2! cat hello1.txt Hi Friends Hi Folks Hi Well-Wishers cat hello2.txt Honey Sweety Darling Required Output (8 Replies)
Discussion started by: jacobs.smith
8 Replies

3. Shell Programming and Scripting

Query the table and return values to shell script and search result values from another files.

Hi, I need a shell script, which would search the result values from another files. 1)execute " select column1 from table_name" query on the table. 2)Based on the result, need to be grep from .wft files. could please explain about this.Below is the way i am using. #!/bin/sh... (4 Replies)
Discussion started by: Rami Reddy
4 Replies

4. Shell Programming and Scripting

Add the values in second and third columns with group by on first column.

Hi All, I have a pipe seperated file. I need to add the values in second and third columns with group by on first column. MYFILE_28012012_1115|47|173.90 MYFILE_28012012_1115|4|0.00 MYFILE_28012012_1115|6|22.20 MYFILE_28012012_1116|47|173.90 MYFILE_28012012_1116|4|0.00... (3 Replies)
Discussion started by: angshuman
3 Replies

5. Shell Programming and Scripting

Sum up the column values group by using some field

12-11-2012,PNL,158406 12-11-2012,RISK,4564 12-11-2012,VAR_1D,310101 12-11-2012,VAR_10D,310101 12-11-2012,CB,866 12-11-2012,STR_VAR_1D,298494 12-11-2012,STR_VAR_10D,309623 09-11-2012,PNL,1024106 09-11-2012,RISK,4565 09-11-2012,VAR_1D,317211 09-11-2012,VAR_10D,317211 09-11-2012,CB,985... (7 Replies)
Discussion started by: manas_ranjan
7 Replies

6. Shell Programming and Scripting

Compare values in two files. For matching rows print corresponding values from File 1 in File2.

- I have two files (File 1 and File 2) and the contents of the files are mentioned below. - I am trying to compare the values of Column1 of File1 with Column1 of File2. If a match is found, print the corresponding value from Column2 of File1 in Column5 of File2. - I tried to modify and use... (10 Replies)
Discussion started by: Santoshbn
10 Replies

7. Shell Programming and Scripting

Print lines containing same values in a group

Hi, I have a table like this: Name A1 A2 A3 B1 B2 B3 111 abc abc abc cbc cbc cbc 222 acv acv n_n bbc bbc bbc 333 bvv bvv bvv cBx ccx ccx 444 ttk ttk ttk kke kke kke 555 mcr mcr mcr mcr mcr mcr The 1st column is just names... (3 Replies)
Discussion started by: polsum
3 Replies

8. Shell Programming and Scripting

search file and group values with problematic tab

hi people; the similar topic is being opened in here and here but i have confused with following condition. so i wanted to open a seperate topic. from my file.txt:... ... ... 110105-16:04:04 192.168.1.1 7.1j Port_NODE_MODEL_M_1_8 stopfile=/tmp/10544... (0 Replies)
Discussion started by: gc_sw
0 Replies

9. Shell Programming and Scripting

Awk: Summing values with group criteria

Hi Guys, I have a text file with ";" like separator F1;F2;F3;F4;F5 444;100041;IT;GLOB;1800000000 444;100041;TM;GLOB;1000000000 444;10300264;IT;GLOB;2000000000 444;10300264;IT;GLOB;2500000000 I have to sum the cullums F5 for same F2 and F3 collums The result must be: ... (7 Replies)
Discussion started by: gianluca2
7 Replies

10. Shell Programming and Scripting

Find all files with group read OR group write OR user write permission

I need to find all the files that have group Read or Write permission or files that have user write permission. This is what I have so far: find . -exec ls -l {} \; | awk '/-...rw..w./ {print $1 " " $3 " " $4 " " $9}' It shows me all files where group read = true, group write = true... (5 Replies)
Discussion started by: shunter63
5 Replies
Login or Register to Ask a Question