Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Script for combining changes in key value pairs

I want to combine 2 files which contains key value pairs for string localizations.
I should keep added values from file 1, and rewrite updated values from file 2.

File 1:

"cart.title" = "Cart";
"cart.subtitle" = "Price";

"checkout.title" = "Checkout";

File 2:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

"cart.title" = "Cart";

"checkout.title" = "Super checkout;

Desired result:

"cart.title" = "Cart";
"cart.subtitle" = "Price";

"checkout.title" = "Super checkout";

I have tried it with awk, but problem is that it always moves new strings from file 1 to end of file. And I want to keep my strings grouped as original file.

awk -F= '!a[$1]++' 2.strings 1.strings > results.strings

But I am struggling to maintain original order and result looks like this:

"cart.title" = "Cart";

"checkout.title" = "Super Checkout";
"cart.subtitle" = "Price";

I think that it should be pretty easy task for anyone who’s domain is Linux.
Thanks in advance.

>Solution :

With your shown samples and attempts, please try following awk code.

awk '
FNR==NR{
  arr1[$1]=$0
  arr2[++count]=$1
  next
}
($1 in arr1){
  arr1[$1]=$0
}
END{
  for(i=1;i<=count;i++){
    print arr1[arr2[i]]
  }
}
' file1 file2

Explanation: Adding detailed explanation for above code.

awk '                       ##Starting awk program from here.
FNR==NR{                    ##Checking condition which will be TRUE when file1 is being read.
  arr1[$1]=$0               ##Creating arr1 with index of $1 and value of $0.
  arr2[++count]=$1          ##Creating arr2 with index of ++count and value of $0.
  next                      ##next will skip all further statements from here.
}
($1 in arr1){               ##Checking condition if $1 is in arr1 then do following.
  arr1[$1]=$0               ##Setting arr1 value to $0 with index of $1.
}
END{                        ##Starting END block of this program from here.
  for(i=1;i<=count;i++){    ##Starting a for loop from 1 to till value of count.
    print arr1[arr2[i]]     ##Printing value of arr1 with index of arr2 here.
  }
}
' file1 file2               ##Mentioning Input_file names here.
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading