Issue
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.
"cart.title" = "Cart";
"cart.subtitle" = "Price";
"checkout.title" = "Checkout";
File 2:
"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.
Answered By - RavinderSingh13 Answer Checked By - Gilberto Lyons (WPSolving Admin)