Unix/Linux Go Back    


UNIX for Dummies Questions & Answers This forum is closed for new posts. Please post beginner questions to learn unix and learn linux in this forum UNIX for Beginners Questions & Answers

Replace string and create new file multiple times

UNIX for Dummies Questions & Answers


 
 
Thread Tools Search this Thread Display Modes
    #1  
Old Unix and Linux 05-25-2016
pseudo.seppuku pseudo.seppuku is offline
Registered User
 
Join Date: May 2016
Last Activity: 25 May 2016, 3:46 PM EDT
Posts: 5
Thanks: 3
Thanked 0 Times in 0 Posts
Replace string and create new file multiple times

First of all, apologies if this has already been answered elsewhere. I haven't quite been able to find what I'm looking for yet, so hopefully this won't come across as repetition.

I have a file consisting of ~100 nearly identical lines, each of which contains multiple instances of the string I need to replace. Let's say the string is simply "001". Each instance of the string within a single line has a slightly different pre/suffix that can be used for search purposes. I know sed is capable of addressing this, but I'm not sure how to proceed with the following steps...

I need to create a new file where the 001 is replaced with 002, while everything else in the line remains unchanged. This will go on until, say, 300 - thus generating 300 different files, each of which needs to be saved separately.

So the first file contains a list like this:


Code:
-file1 001.txt -file2 blah1.txt -outputx x001blah1 -outputy y001blah1
-file1 001.txt -file2 blah2.txt -outputx x001blah2 -outputy y001blah2
-file1 001.txt -file2 blah3.txt -outputx x001blah3 -outputy y001blah3

...saved as list001.txt. I need to replace the three instances of 001 with 002 and save that file as list002.txt, which would look like this:


Code:
-file1 002.txt -file2 blah1.txt -outputx x002blah1 -outputy y002blah1
-file1 002.txt -file2 blah2.txt -outputx x002blah2 -outputy y002blah2
-file1 002.txt -file2 blah3.txt -outputx x002blah3 -outputy y002blah3

And so on and so forth until list300.txt (this number is pre-defined).

If I were to do this manually, it would require searching and replacing over a thousand times. Is there a single script I can use to find, replace, and create all 300 files, without having to make and modify each one individually?

Last edited by pseudo.seppuku; 05-25-2016 at 12:23 PM..
Sponsored Links
    #2  
Old Unix and Linux 05-25-2016
Corona688 Corona688 is offline Forum Staff  
Mead Rotor
 
Join Date: Aug 2005
Last Activity: 20 October 2017, 3:09 PM EDT
Location: Saskatchewan
Posts: 22,469
Thanks: 1,143
Thanked 4,262 Times in 3,936 Posts
To be honest, these 300 lists sound like something that could be replaced with a single script, if you could tell us what you're actually trying to do.
Sponsored Links
    #3  
Old Unix and Linux 05-25-2016
pseudo.seppuku pseudo.seppuku is offline
Registered User
 
Join Date: May 2016
Last Activity: 25 May 2016, 3:46 PM EDT
Posts: 5
Thanks: 3
Thanked 0 Times in 0 Posts
Each line corresponds to an individual command for a program designed to compare two different files (e.g. 001/blah1, 001/blah2, 001/blah3, etc.). I can't stray from the basic format described in my first post or carry out multiple comparisons using a single command. Given that I have a few hundred files to compare, I'm looking for a quicker way to generate this list of commands.

I'll join all 300 files together later on using cat, but at this stage, I figured it might be easier (from a scripting standpoint) to create a new file after each replacement, rather than continually append a set of modified lines to the end of one very long file.
    #4  
Old Unix and Linux 05-25-2016
RavinderSingh13 RavinderSingh13 is online now Forum Advisor  
Registered User
 
Join Date: May 2013
Last Activity: 21 October 2017, 12:43 AM EDT
Location: Chennai
Posts: 2,635
Thanks: 582
Thanked 1,254 Times in 1,129 Posts
Hello pseudo.seppuku,

Welcome to forums. Could you please try following and let me know if this helps you.

Code:
for file in *.txt
do
     let "i = i + 1"
     awk -vI=$i '{gsub(/001/,"002",$0);VAL=sprintf("%s%02d",FILENAME,I);print >> VAL}' $file
done

Thanks,
R. Singh
The Following User Says Thank You to RavinderSingh13 For This Useful Post:
pseudo.seppuku (05-25-2016)
Sponsored Links
    #5  
Old Unix and Linux 05-25-2016
pseudo.seppuku pseudo.seppuku is offline
Registered User
 
Join Date: May 2016
Last Activity: 25 May 2016, 3:46 PM EDT
Posts: 5
Thanks: 3
Thanked 0 Times in 0 Posts
Thank you! That certainly did the trick. The only caveat is that the new file is called list001.txt01 instead of list002.txt.

Aside from the file-naming convention... is there a way to do this multiple times in a row, using a single script? In other words, i = i + (1..299) - each time saved as a new file?
Sponsored Links
    #6  
Old Unix and Linux 05-25-2016
RudiC RudiC is offline Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 20 October 2017, 2:22 PM EDT
Location: Aachen, Germany
Posts: 11,479
Thanks: 310
Thanked 3,561 Times in 3,276 Posts
Try
Code:
awk '
        {ARR[NR] = $0}
END     {for (i=1; i<=MAX; i++) {if (FN) close (FN)
                                 TCNT = sprintf ("%03d", i)
                                 FN = FILENAME TCNT ".txt" 
                                 for (j=1; j<=NR; j++)  {T = ARR[j]
                                                         gsub (/001/, TCNT, T)
                                                         print T > FN
                                                        }
                                }
        }
' MAX=3 file
cf *.txt
file001.txt:
-file1 001.txt -file2 blah1.txt -outputx x001blah1 -outputy y001blah1
-file1 001.txt -file2 blah2.txt -outputx x001blah2 -outputy y001blah2
-file1 001.txt -file2 blah3.txt -outputx x001blah3 -outputy y001blah3
file002.txt:
-file1 002.txt -file2 blah1.txt -outputx x002blah1 -outputy y002blah1
-file1 002.txt -file2 blah2.txt -outputx x002blah2 -outputy y002blah2
-file1 002.txt -file2 blah3.txt -outputx x002blah3 -outputy y002blah3
file003.txt:
-file1 003.txt -file2 blah1.txt -outputx x003blah1 -outputy y003blah1
-file1 003.txt -file2 blah2.txt -outputx x003blah2 -outputy y003blah2
-file1 003.txt -file2 blah3.txt -outputx x003blah3 -outputy y003blah3

The Following User Says Thank You to RudiC For This Useful Post:
pseudo.seppuku (05-25-2016)
Sponsored Links
    #7  
Old Unix and Linux 05-25-2016
RavinderSingh13 RavinderSingh13 is online now Forum Advisor  
Registered User
 
Join Date: May 2013
Last Activity: 21 October 2017, 12:43 AM EDT
Location: Chennai
Posts: 2,635
Thanks: 582
Thanked 1,254 Times in 1,129 Posts
Quote:
Originally Posted by pseudo.seppuku View Post
Thank you! That certainly did the trick. The only caveat is that the new file is called list001.txt01 instead of list002.txt.
Aside from the file-naming convention... is there a way to do this multiple times in a row, using a single script? In other words, i = i + (1..299) - each time saved as a new file?
Hello pseudo.seppuku,

Could you please try following and let me know if this helps, not tested though.

Code:
for file in *.txt; do let "i = i + 1"; awk -vI=$i '{gsub(/001/,"002",$0);VAL=sprintf("%02d",I);print >> FILENAME VAL;}' $file; done

Thanks,
R. Singh
The Following User Says Thank You to RavinderSingh13 For This Useful Post:
pseudo.seppuku (05-25-2016)
Sponsored Links
 

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Linux More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Sed replace using same pattern repeating multiple times in a line sol_nov Shell Programming and Scripting 4 10-15-2012 09:01 PM
replace (sed?) a string in file with multiple lines (string) from variable jforce Shell Programming and Scripting 2 09-15-2011 10:10 AM
Find string multiple times, same line jgrosecl UNIX for Dummies Questions & Answers 7 07-11-2011 02:33 PM
replace a string with contents of a txt file containing multiple lines of strings 4dirk1 Shell Programming and Scripting 13 04-26-2011 03:19 AM
replace (sed?) a single line/string in file with multiple lines (string) from another file?? tuathan Shell Programming and Scripting 5 04-20-2011 12:16 AM



All times are GMT -4. The time now is 12:46 AM.