Awk/sed to replace variable in file


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Awk/sed to replace variable in file
# 1  
Old 11-16-2019
Awk/sed to replace variable in file

Hi All

I have one file with multiple lines in it, each line has static text and some variable enclosed in <<filename>> as well. e.g. as below
Code:
123, <<file1.txt>> this is my name, I stay at <<city.txt>> Thanks for visiting
348384y,  this is my name <<fileabc.txt>>, I stay at near the mall of <<cityxyz.txt>> welcome

each variable is a file which has content as below
Code:
cat file1.txt
scott
thomas

Code:
cat city.txt
CHICAGO 
LA
TAT

I am looking for a code which can print the file line with variable value from each file as Cartesian Product as below
Code:
123, scott this is my name, I stay at CHICAGO Thanks for visiting
123, scott this is my name, I stay at LA Thanks for visiting
123, scott this is my name, I stay at TAT Thanks for visiting
123, thomas this is my name, I stay at CHICAGO Thanks for visiting
123, thomas this is my name, I stay at LA Thanks for visiting
123, thomas this is my name, I stay at TAT Thanks for visiting
similar way second line with value from their file name per variable

Is there any quicker/simpler way to do in awk/sed/perl or shell scripting?

Thanks
rel

Last edited by RavinderSingh13; 11-16-2019 at 11:55 PM..
# 2  
Old 11-16-2019
Any attempts / ideas / thoughts from your side?
# 3  
Old 11-17-2019
Hi Rudi

I have idea to do via shell scripting, read this file line by line, find the 1st variable in line and get the relevant fileName which has the value/records and print it as value replacement for full line in a new temp file. Then again read this temp file in loop, replace the second variable for each line and create final output file. though it is possible but it would be little lengthy and difficult if there are more than 2 such variables. thats why i am looking for any straight and simple way if possible
# 4  
Old 11-17-2019
Hello reldb,

Could you please try following.

Code:
awk '
FILENAME=="file1.txt"{
  name[FNR]=$0
  next
}
FILENAME=="city.txt"{
  city[++count]=$0
  next
}
{
  val=$0
  for(i=1;i<=count;i++){
     sub(/<<file1.txt>>/,name[FNR])
     sub(/<<city.txt>>/,city[i])
     print
     $0=val
  }
}' file1.txt   city.txt   Input_file

Output will be as follows.

Code:
123, scott this is my name, I stay at CHICAGO  Thanks for visiting
123, scott this is my name, I stay at LA Thanks for visiting
123, scott this is my name, I stay at TAT Thanks for visiting
348384y,  this is my name thomas, I stay at near the mall of CHICAGO  welcome
348384y,  this is my name thomas, I stay at near the mall of LA welcome
348384y,  this is my name thomas, I stay at near the mall of TAT welcome

Thanks,
R. Singh
# 5  
Old 11-17-2019
Try also
Code:
awk '
BEGIN   {PAT = "<<[^>]*>>"
        }

        {match ($0, PAT)
         NXT = RSTART + RLENGTH
         while (0 < getline T1[++CNT1] < (substr ($0, RSTART+2, RLENGTH-4)) );
         match (substr ($0, NXT), PAT)
         while (0 < getline T2[++CNT2] < (substr ($0, NXT+RSTART+1, RLENGTH-4)) ) ;
         for (i=1; i<CNT1; i++)
          for (j=1; j<CNT2; j++)        {TMP = $0
                                         sub (PAT, T1[i], TMP)
                                         sub (PAT, T2[j], TMP)
                                         print TMP
                                        }
         CNT1 = CNT2 = 0
        }
' file
123, scott this is my name, I stay at CHICAGO  Thanks for visiting
123, scott this is my name, I stay at LA Thanks for visiting
123, scott this is my name, I stay at TAT Thanks for visiting
123, thomas this is my name, I stay at CHICAGO  Thanks for visiting
123, thomas this is my name, I stay at LA Thanks for visiting
123, thomas this is my name, I stay at TAT Thanks for visiting
348384y,  this is my name scott, I stay at near the mall of CHICAGO  welcome
348384y,  this is my name scott, I stay at near the mall of LA welcome
348384y,  this is my name scott, I stay at near the mall of TAT welcome
348384y,  this is my name thomas, I stay at near the mall of CHICAGO  welcome
348384y,  this is my name thomas, I stay at near the mall of LA welcome
348384y,  this is my name thomas, I stay at near the mall of TAT welcome

Be aware that there's no error handling yet, e.g. if one of the filenames in a line is not found, or the are no two patterns in a line.
# 6  
Old 11-17-2019
Code:
awk -F'<<|>>' '{while((getline d<$2) > 0){while((getline b<$4) > 0) print $1 d $3 b $4; close($4)}}'


Last edited by nezabudka; 11-17-2019 at 12:25 PM..
These 2 Users Gave Thanks to nezabudka For This Post:
# 7  
Old 11-18-2019
Hi Rudi
Thanks for sharing the detail
I tried your solution, and it worked for lines where variable exists exactly 2 times in that particular line.
There are lines in main file where no variable exits or only one variable exits instead of 2 times in the line, then it is giving error.
any suggestion to handle that

Thanks a lot
Rel
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

How to replace the complex strings from a file using sed or awk?

Dear All, I am having a requirement to find the difference between 2 files and generate a discrepancy report out of it as an html page. I prefer using diff -y file1 file2 since it gives user friendly layout to know any discrepancy in the record and unique records among the 2 file. Here's how it... (12 Replies)
Discussion started by: Badhrish
12 Replies

2. Shell Programming and Scripting

How to replace a string with a variable in a file using sed?

I have a file having some text like: PATH_ABC=/user/myLocation I have to replace "/user/myLocation" with a session variable say, $REPLACE_PATH, where $REPLACE_PATH=/user/myReplaceLocation The following sed command is not working. It is writing PATH_ABC=$REPLACE_PATH in the file ... (2 Replies)
Discussion started by: SKhan
2 Replies

3. Shell Programming and Scripting

sed/awk script to replace only FIRST comment in the file

My first comment on every file contains the license message. I want to replace with a new license message. I used the below sed script, which replaces all comments. What is the modification or any other method with awk script for the below to edit only the first comment(license message)? #sed -f... (1 Reply)
Discussion started by: vpshastry
1 Replies

4. Shell Programming and Scripting

Replace value of a variable in a file through script using sed

Hi, I am trying to replace the value of a variable in a file through another script. Example: Filename : abc.txt contents: a=10 b=20 c=30 Need to change the value of, say, b - Tried using the following: sed "s/${b}/15/g" abc.txt Have tried various forms of sed (with single quotes,... (4 Replies)
Discussion started by: rituparna_gupta
4 Replies

5. Shell Programming and Scripting

sed or awk to replace a value in a certain line from another file containing a string

Hi experts, In my text file I have the following alot of lines like below. input.k is as follows. 2684717 -194.7050476 64.2345581 150.6500092 0 0 2684718 -213.1575623 62.7032242 150.6500092 0 0 *INCLUDE $# filename... (3 Replies)
Discussion started by: hamnsan
3 Replies

6. Red Hat

How to pass value of pwd as variable in SED to replace variable in a script file

Hi all, Hereby wish to have your advise for below: Main concept is I intend to get current directory of my script file. This script file will be copied to /etc/init.d. A string in this copy will be replaced with current directory value. Below is original script file: ... (6 Replies)
Discussion started by: cielle
6 Replies

7. Shell Programming and Scripting

using sed/awk to replace a block of text in a file?

My apologies if this has been answered in a previous post. I've been doing a lot of searching, but I haven't been able to find what I was looking for. Specifically, I am wondering if I can utilize sed and/or awk to locate two strings in a file, and replace everything between those two strings... (12 Replies)
Discussion started by: kiddsupreme
12 Replies

8. Shell Programming and Scripting

Sed or awk for batch replace file name

Can you please point me in the correct direction? I need a line or script to run though a given directory and find all files with "@domain.local" in there names and simple remove that. For example if the files were named 1234@domain.local the file would then become 1234. (1 Reply)
Discussion started by: binary-ninja
1 Replies

9. Shell Programming and Scripting

using file-and-replace sed command with the use of a variable?

Ok, so, let's say I have the variable $GMAILID....How can I use it with sed command so to replace a string in a file? e.g.: sed -i 's/$GMAILID/test@gmail.com/' /home/$USER/Desktop/sendmail (4 Replies)
Discussion started by: hakermania
4 Replies

10. Shell Programming and Scripting

Find and replace with variable using sed or awk

hi, i have file say email.temp looks like Bell_BB 17 Bell_MONTHLY 888 SOLO_UNBEATABLE 721 and another file r3 Bell BB,Bell_BB Bell,Bell_MONTHLY SOLO,SOLO_UNBEATABLE i want email.temp files $1 say Bell_BB should be replaced by r3 Bell BB and Bell_MONTHLY by... (2 Replies)
Discussion started by: raghavendra.cse
2 Replies
Login or Register to Ask a Question