sed problem in a for cycle


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting sed problem in a for cycle
# 1  
Old 02-16-2010
sed problem in a for cycle

Hi, i have a problem with a sed command runned in a for cycle...

I have a file named fileX which contains (i have crippled the line to minimal for easy):

Code:
 
load data dbfoo - TOCHANGE - comment
load data dbboo - TOCHANGE - comment
load data dbzoo - TOCHANGE - comment
...

And a file named fileY which contains:

Code:
 
value1
value2
value3
...

I don't understand why sed change every occurrence of TOCHANGE in fileX, i have read that sed change the first occurrence and then proceed if switch "g" is omitted...
The portion of the code where i surely have made an error is:

Code:
 
for TC in `cat fileY`
do
 sed s/"TOCHANGE"/"$TC" fileX > results
done

I've thinked that the file results will be like:

Code:
 
load data dbfoo - value1 - comment
load data dbboo - value2 - comment
load data dbzoo - value3 - comment
...

Because the echo on variable TC show me the values in order...
But instead i have this:

Code:
 
load data dbfoo - valueX - comment
load data dbboo - valueX - comment
load data dbzoo - valueX - comment
...

Someone may help this beginner of me?

Thx a lot
# 2  
Old 02-16-2010
Let me guess, your script leaves the last value in the fileY.

You say sed change the first occurrence and then proceed if switch "g" is omitted, this is correct, but for each line. fileX includes TOCHANGE in every line, so for every line sed will change the first occurrence.

I think you can apply sed substitution only for a 1 line range, but I don't know how.

What if you use AWK instead

Code:
awk 'NR==FNR{alias[FNR]=$0;next}{if (match($0, "TOCHANGE")){i++;sub("TOCHANGE", alias[i])}print $0}' fileY fileX

# 3  
Old 02-16-2010
Tools sed command input=filex output=results

I think an issue is that each iteration will change for filex to results. But, you never in-between copy results back to filex before doing the next step.
So, after your sed, you would need something like
Code:
cp results filex

# 4  
Old 02-16-2010
I'm not exactly certain what it is you're trying to do, so hopefully some general advice might be of use:

To change the first instance of "a" to "b" on _every_ line:
Code:
sed 's/a/b/' file

]
To change the first instance of "a" to "b" in a file:
Code:
sed '/a/{s/a/b/;q;}' file

In sed's substitution command, an empty regular expression is equal to the most recent regular expression used, so "s/a/b/" could have been written as "s//b/".

alister
# 5  
Old 02-17-2010
Thx to all, i've tried both sed solution but it doesn't work...

Like kcoder24 said the intent was to change the first occurrence for a single line and pass to next line on every cicle of for statement...

I try to explain myself better, in fileX i have the lines to change and in fileY i have the values to insert sequentially on every line of fileX.
Both fileX and fileY has the same number of lines because the origin of both files is unique.

Then i wish the results may be this:

Code:
 
line1 of file fileX with string-to-replace substituted by string line1 of fileY
line2 of file fileX with string-to-replace substituted by string line2 of fileY
and so on...

I try to make a good example with some values...

fileY contains:

Code:
 
goose
mickey
donald
...

fileX contains:

Code:
 
My name is frank ZORRO and i live in Bilbao
My name is paul ZORRO and i live in Bilbao
My name is john ZORRO and i live in Bilbao
...

The result i wish at last would be:

result contains:

Code:
 
My name is frank goose and i live in Bilbao
My name is paul mickey and i live in Bilbao
My name is john donald and i live in Bilbao
...

Any suggestion?
# 6  
Old 02-17-2010
Try:
Code:
awk '{getline x<f;sub(/ZORRO/,x)}1' f=file1 file2

Output:
Code:
My name is frank goose and i live in Bilbao
My name is paul mickey and i live in Bilbao
My name is john donald and i live in Bilbao

# 7  
Old 02-17-2010
Thx a lot Scrutinizer i have tested your code and is working exacly as i need...

Let me see an awk tutorial and then i try to explain your code, if u find that i have misunderstood someone scold me... Smilie

---------- Post updated at 07:40 AM ---------- Previous update was at 06:55 AM ----------

May someone tell me if i have understood the code meaning?
It's important to learn, more than find the solution right?

Thx

Code:
 
awk '{getline x<f;sub(/ZORRO/,x)}1' f=file1 file2
............................................^___^ Target of awk command
....................................^_____^ Variable defined for awk that's pointing at file1
.................................^ I give up... Hope this "1" means to make sub on the first occurence...
.....................^_________^ replace ZORRO with the value in x variable
......^_________^ Read input line from f where f is the file1 and then put in x variable
....^_____________________________^ Entire program - switches - options parts of the command
.....^__________________________^ Program part that awk executes (code between the graphs)

Login or Register to Ask a Question

Previous Thread | Next Thread

7 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

For cycle and formatting stdout

Dear all, I want to create a table using a shell script. Hope someone can help. I created a variable that contains the path for different files. For all the files I want to do calculations and print it to stdout (or file) as a table. I tried this code: paths=`cat $tabdelim_file | awk... (7 Replies)
Discussion started by: Higgo
7 Replies

2. Shell Programming and Scripting

Cycle for with for-then-else

Hi, i would like to insert a if-then-else function in to cycle for -------------- cat test -------------- # cat test ALFA BETA GAMMA ----------------------- This is my script: #!/bin/bash for i in $(cat test); if ; then echo "ok" else (5 Replies)
Discussion started by: elilmal
5 Replies

3. Shell Programming and Scripting

for cycle question

i have a question how to modify below script to generate the expect result below : test.sh #!/bin/bash for ((i=0; i < 25; i++)) do echo $1$i done current result: test.sh 20090101 200901010 200901011 200901012 200901013 200901014 200901015 200901016 200901017 200901018 (2 Replies)
Discussion started by: bleach8578
2 Replies

4. Shell Programming and Scripting

for cycle

Hello, I have a question: is there a way to have a "for" cycle done a certain number of times. For example in c++ I can do this: for (i=o;i<10;i++) and the cycle will be repeated 10 times. in UNIX for example I do this: for i in `cat /etc/host` do done and the cycle will be repeated... (6 Replies)
Discussion started by: jcpetela
6 Replies

5. Shell Programming and Scripting

wildcard in a if cycle

hello everybody, I need help on putting a wildcard match inside an if condition (I'm using korn shell): if ] then echo ' ' echo ''$MYSEL' is not a correct option' echo ' ' else ..... i tried also #if -ne "``" and a lot of combinations of `"' but I didn't find the... (2 Replies)
Discussion started by: elionba82
2 Replies

6. Shell Programming and Scripting

For cycle

Hello, I have files in a dir. I what to create a FOR cycle that will do this FOR <condition> do file=`ls <directory> | tail -1` echo $file mv -f $file <another dir> done What I want to now is what should I put in the <condition>. The condition I want is that the FOR will execute... (3 Replies)
Discussion started by: nagomes
3 Replies

7. Shell Programming and Scripting

shell cycle

Hello I got a cycle in the script which open another scripts. if then action fi Scripts action will be running 2 times at the same time. Inside of action() is insert into the table. But what I want is that only first script can do insert into table. So how to do... (2 Replies)
Discussion started by: mape
2 Replies
Login or Register to Ask a Question