Search a string,get line and replace with second field


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Search a string,get line and replace with second field
# 1  
Old 05-16-2012
Search a string,get line and replace with second field

Hi,

I need to search for source path in file2 , as per file1 and if found get the next line and take the field value and put it in URL value of file1.
In file1, NF is not same for all the lines.

file1:
Code:
<type source="/home/USER/Desktop" Dest="/home/USER/DIR1/Desktop" URL="ssh/path"/>
<type source="/home/USER/OP1" URL="internet/external/path"/>
<type source="/home/USER/Exe" Dest="/home/USER/DIR1/Exe" URL="intranet/path/add"/>

file2:
Code:
<path source="/home/USER/Desktop" value="/home/USER/XYZ/Desktop">
    <key value="customer/priority"/>
    <scm tool="toolname/revision"/>
.... some line here
  </path>

<path source="/home/USER/OP1" value="/home/USER/XYZ/ABC/OP1">
    <key value="customer/priority2"/>
    <scm tool="toolname/revision"/>
.... few more lines
  </path>

<path source="/home/USER/Exe" value="/home/USER/XYZ/ABC/Exe">
    <key value="customer/priority4"/>
    <scm tool="toolname/revision"/>
.... few more lines
  </path>

code tried:
Code:
awk -F\" '/^<type/ {print $2}' file1 > a.xml
while read line
do
OUTPUT=`awk -F\" -v b="$line" '$0 ~ b {getline; print $2}' file2`
awk -F\" -v proj="$line" -v repl=ref/img/"$OUTPUT" '$0 ~ proj { $6=repl;print $0}' OFS=\" file1
done < a.xml > OUTPUT

Desired output:
Code:
<type source="/home/USER/Desktop" Dest="/home/USER/DIR1/Desktop" URL="ref/img/customer/priority"/>
<type source="/home/USER/OP1" URL="ref/img/customer/priority2"/>
<type source="/home/USER/Exe" Dest="/home/USER/DIR1/Exe" URL="ref/img/customer/priority4"/>

I appreciate your help.

---------- Post updated 16th May 2012 at 01:35 AM ---------- Previous update was 15th May 2012 at 07:00 AM ----------

Any other approach than given try?

( Though pumping is not allowed Smilie )

Last edited by greet_sed; 05-15-2012 at 09:03 AM.. Reason: updated desired output
# 2  
Old 05-17-2012
still no idea Smilie
# 3  
Old 05-17-2012
Quote:
Originally Posted by greet_sed
still no idea Smilie
Code:
# awk 'NR==FNR{if($0~/key value/){split($0,a,"=");sub("^\"","",a[2]);s[x++]=a[2]}}NR!=FNR{xx="\"ref/img/";{sub("URL=.*","URL="xx s[i++],$0);print}
}' file2 file1
<type source="/home/USER/Desktop" Dest="/home/USER/DIR1/Desktop" URL="ref/img/customer/priority"/>
<type source="/home/USER/OP1" URL="ref/img/customer/priority2"/>
<type source="/home/USER/Exe" Dest="/home/USER/DIR1/Exe" URL="ref/img/customer/priority4"/>

This User Gave Thanks to ygemici For This Post:
# 4  
Old 05-17-2012
@ ygemici:
Brilliant . It works . Thanks for the solution. Smilie

can you please explain this part?
Code:
 s[x++]=a[2]}}NR!=FNR{xx="\"ref/img/";{sub("URL=.*","URL="xx s[i++],$0);print


Last edited by greet_sed; 05-17-2012 at 11:45 AM.. Reason: added code tags
# 5  
Old 05-17-2012
Quote:
Originally Posted by greet_sed
@ ygemici:
Brilliant . It works . Thanks for the solution. Smilie

can you please explain this part?
Code:
 s[x++]=a[2]}}NR!=FNR{xx="\"ref/img/";{sub("URL=.*","URL="xx s[i++],$0);print

while read the line we want to get that matches ("key value") from file2 and split it to the parts with '=' and assign to and array that named "a"
[ our line was --> <key value="customer/priority"/> )
so
Code:
a[1] -->"    <key value"
a[2] -->""customer/priority"/>"

and works same procedure on the for other matches lines...
and we collect the all a[2] to one array that named "s"
Code:
s[0]-->"customer/priority"/>"
s[1]-->"customer/priority2"/>"
s[2]-->"customer/priority4"/>"

and reading the file2 must finish Smilie
and if the NR is equal the FNR so it is read first file,,
else awk start to read other files (second,third,...)
so NR!=FNR is simply means the awk start to reading process from second and other files..
in our issue,we read the second file so it is "file1" remember file arguments
Code:
awk ... file2 file1

Code:
xx="\"ref/img/" -->  it s just an assing a value.. xx=""ref/img/" (we will add the starting of the new URL value )

Code:
sub("URL=.*","URL="xx s[i++],$0)

--> change the URL=.* -->
Code:
URL="ref/img/customer/priority"/>
with
URL="xx + s[0]    " ,from our line ($0)
xx->""ref/img/"
s[0]->"customer/priority"/>"
so new URL express --> "URL="ref/img/customer/priority"/>"

we change the URL portion from our line and
print-> print the new line (with new URL)

so every read line (records) means the `i` will increase by one [i++]
finally , works same procedure for the other lines from file1 with s[1] and s[2] values

regards
ygemici
This User Gave Thanks to ygemici For This Post:
# 6  
Old 05-17-2012
Thanks again for detailed explanation.

If lines are not in same order i get wrong output because search is not based on field 2 ( ie /home/USER/Desktop , /home/USER/Exe , /home/USER/OP1 etc )

For example if file2 contains the following:
Code:
<path source="/home/USER/Desktop" value="/home/USER/XYZ/Desktop">
    <key value="customer/priority"/>
    <scm tool="toolname/revision"/>
  </path>

<path source="/home/USER/Exe" value="/home/USER/XYZ/ABC/Exe">
    <key value="customer/priority4"/>
    <scm tool="toolname/revision"/>
  </path>

<path source="/home/USER/OP1" value="/home/USER/XYZ/ABC/OP1">
    <key value="customer/priority2"/>
    <scm tool="toolname/revision"/>
  </path>

I get wrong output as :
Code:
<type source="/home/USER/Desktop" Dest="/home/USER/DIR1/Desktop" URL="ref/img/customer/priority"/>
<type source="/home/USER/OP1" URL="ref/img/customer/priority4"/> 
<type source="/home/USER/Exe" Dest="/home/USER/DIR1/Exe" URL="ref/img/customer/priority2"/>

# 7  
Old 05-17-2012
Try this:

Code:
BEGIN { FS="\""; OFS="\"" }
NR==FNR {
    for (i=1; i<=NF; i++) {
    if ($i ~ "<path source")
        key = $(i+1)
    if ($i ~ "<key value")
        val = $(i+1)
    }
    store[key] = val;
    next;
}
{
    for (i=1; i<=NF; i++) {
    if ($i ~ "<type source")
        key = $(i+1)
        if ($i ~ "URL")
        $(i+1) = "ref/img/" store[key]
    }
    print
}

save it as e.g. replace.awk and run as
Code:
awk -f replace.awk file2 file1

This User Gave Thanks to mirni For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Search for a string,delete the line and replace with new string in a file

Hi Everyone, I have a requirement in ksh where i have a set of files in a directory. I need to search each and every file if a particular string is present in the file, delete that line and replace that line with another string expression in the same file. I am very new to unix. Kindly help... (10 Replies)
Discussion started by: Pradhikshan
10 Replies

2. Shell Programming and Scripting

Search string within a file and list common words from the line having the search string

Hi, Need your help for this scripting issue I have. I am not really good at this, so seeking your help. I have a file looking similar to this: Hello, i am human and name=ABCD. How are you? Hello, i am human and name=PQRS. I am good. Hello, i am human and name=ABCD. Good bye. Hello, i... (12 Replies)
Discussion started by: royzlife
12 Replies

3. Shell Programming and Scripting

Search several string and convert into a single line for each search string using awk command AIX?.

I need to search the file using strings "Request Type" , " Request Method" , "Response Type" and by using result set find the xml tags and convert into a single line?. below are the scenarios. Cat test Nov 10, 2012 5:17:53 AM INFO: Request Type Line 1.... (5 Replies)
Discussion started by: laknar
5 Replies

4. Shell Programming and Scripting

Awk Search text string in field, not all in field.

Hello, I am using awk to match text in a tab separated field and am able to do so when matching the exact word. My problem is that I would like to match any sequence of text in the tab-separated field without having to match it all. Any help will be appreciated. Please see the code below. awk... (3 Replies)
Discussion started by: rocket_dog
3 Replies

5. Shell Programming and Scripting

perl search and replace - search in first line and replance in 2nd line

Dear All, i want to search particular string and want to replance next line value. following is the test file. search string is tmp,??? ,10:1 "???" may contain any 3 character it should remain the same and next line replace with ,10:50 tmp,123 --- if match tmp,??? then... (3 Replies)
Discussion started by: arvindng
3 Replies

6. Shell Programming and Scripting

To trim Certain field in a line of a file and replace the new string in that position

To trim 3rd field in for all the lines of a file and replace the modified string in that particular field. For example i have a file called Temp.txt having content Temp.txt ----------------- 100,234,M1234 400,234,K1734 300,345,T3456 ---------------- So the modified file output should... (4 Replies)
Discussion started by: rpadhi
4 Replies

7. Shell Programming and Scripting

search for a string ,replace the whole line with new line

hai i am very new to unix. i am having two files like this. first.properties cache.ZA.TL_CCY=SELECT trim(CCY_CODE)||trim(COUNTRY_CODE)||trim(CITY_CODE) AS... (4 Replies)
Discussion started by: kkraja
4 Replies

8. UNIX for Dummies Questions & Answers

how can search a String in one text file and replace the whole line in another file

i am very new to UNIX plz help me in this scenario i have two text files as below file1.txt name=Rajakumar. Discipline=Electronics and communication. Designation=software Engineer. file2.txt name=Kannan. Discipline=Mechanical. Designation=CADD Design Engineer. ... (6 Replies)
Discussion started by: kkraja
6 Replies

9. Shell Programming and Scripting

Perl: Search for string on line then search and replace text

Hi All, I have a file that I need to be able to find a pattern match on a line, search that line for a text pattern, and replace that text. An example of 4 lines in my file is: 1. MatchText_randomNumberOfText moreData ReplaceMe moreData 2. MatchText_randomNumberOfText moreData moreData... (4 Replies)
Discussion started by: Crypto
4 Replies

10. Shell Programming and Scripting

how to insert line break + string in vi (search & replace )

Hello all i have big test file that has allot of structure text something like this : <foo1 *.html> <blah action> somthing 1 somthing 2 </blah> </foo1 > now i will like to insert 2 more lines of text below the <blah action> so it will be like : <foo1... (1 Reply)
Discussion started by: umen
1 Replies
Login or Register to Ask a Question