Two Loops


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Two Loops
# 8  
Old 01-20-2011
I'm sorry if I am not making sense.

Your previous post works well for simple sentences that I would print with no special characters.
but since my lines have lots of commas and quotes and such its was hard

So my thought was if I did a for loop it would just loop through the file and for each line enter it in where I needed it. Then it would loop through the file again and find the second value (second column) and enter it.

so here is what I need done:
file:
Code:
red blue
white black

have it print:
Code:
"'',165,1293537000,0,'Logs - ABC','$red','*Log*.log','/usr/apps/collectors/$red/log',60,'no',120,'yes',180,'yes'"
"'',198,1295520870,0,'ABC_INBOUND','$red','*$blue*','/usr/apps/$red/BR_ABC/ARCHIVE',60,'no',120,'no',180,'yes'"
"'',165,1293537000,0,'Logs - ABC','$white','*Log*.log','/usr/apps/collectors/$white/log',60,'no',120,'yes',180,'yes'"
"'',198,1295520870,0,'ABC_INBOUND','$white','*$black*','/usr/apps/$white/BR_ABC/ARCHIVE',60,'no',120,'no',180,'yes'"

# 9  
Old 01-20-2011
A Perl solution follows -

Code:
$
$
$ # display the contents of the data file "f1"
$
$ cat f1
red blue
white black
$
$
$ # display the contents of the Perl program that processes "f1"
$
$ cat -n f1.pl
   1  #!perl -w
   2
   3  # The template string uses here-doc to take care of multiple lines and single/double quotes
   4  $template = <<END;
   5  "'',165,1293537000,0,'Logs - ABC','\$FIRST','*Log*.log','/usr/apps/collectors/\$FIRST/log',60,'no',120,'yes',180,'yes'"
   6  "'',198,1295520870,0,'ABC_INBOUND','\$FIRST','*\$SECOND*','/usr/apps/\$FIRST/BR_ABC/ARCHIVE',60,'no',120,'no',180,'yes'"
   7  END
   8
   9  # process the file now
  10  open (FH, "f1") or die "Can't open f1: $!";         # open file and assign file handle
  11  while (<FH>) {                                      # while we can read records
  12    chomp;                                            # remove the newline at the end
  13    ($first, $second) = m/^\s*(\w+)\s*(\w+)\s*$/;     # split record into two fields $first and $second, using regex
  14    $line = $template;                                # assign template to the line we are going to work with
  15    $line =~ s/FIRST/$first/g;                        # substitute first and second fields
  16    $line =~ s/SECOND/$second/g;
  17    print $line;                                      # and print the line
  18  }
  19  close (FH) or die "Can't close f1: $!";             # clean up when it's all done
$
$
$ # Now run the Perl program
$
$ perl f1.pl
"'',165,1293537000,0,'Logs - ABC','$red','*Log*.log','/usr/apps/collectors/$red/log',60,'no',120,'yes',180,'yes'"
"'',198,1295520870,0,'ABC_INBOUND','$red','*$blue*','/usr/apps/$red/BR_ABC/ARCHIVE',60,'no',120,'no',180,'yes'"
"'',165,1293537000,0,'Logs - ABC','$white','*Log*.log','/usr/apps/collectors/$white/log',60,'no',120,'yes',180,'yes'"
"'',198,1295520870,0,'ABC_INBOUND','$white','*$black*','/usr/apps/$white/BR_ABC/ARCHIVE',60,'no',120,'no',180,'yes'"
$
$

tyler_durden

The template string will not be interpolated if the here-doc keyword is surrounded by single quotes. So the escape characters for the dollar symbols can be avoided like so -

Code:
$
$ cat -n f1.pl
    1  #!perl -w
    2
    3  # The template string uses here-doc to take care of multiple lines and single/double quotes
    4  $template = <<'END';
    5  "'',165,1293537000,0,'Logs - ABC','$FIRST','*Log*.log','/usr/apps/collectors/$FIRST/log',60,'no',120,'yes',180,'yes'"
    6  "'',198,1295520870,0,'ABC_INBOUND','$FIRST','*$SECOND*','/usr/apps/$FIRST/BR_ABC/ARCHIVE',60,'no',120,'no',180,'yes'"
    7  END
    8
    9  # process the file now
   10  open (FH, "f1") or die "Can't open f1: $!";         # open file and assign file handle
   11  while (<FH>) {                                      # while we can read records
   12    chomp;                                            # remove the newline at the end
   13    ($first, $second) = m/^\s*(\w+)\s*(\w+)\s*$/;     # split record into two fields $first and $second, using regex
   14    $line = $template;                                # assign template to the line we are going to work with
   15    $line =~ s/FIRST/$first/g;                        # substitute first and second fields
   16    $line =~ s/SECOND/$second/g;
   17    print $line;                                      # and print the line
   18  }
   19  close (FH) or die "Can't close f1: $!";             # clean up when it's all done
$
$
$ perl f1.pl
"'',165,1293537000,0,'Logs - ABC','$red','*Log*.log','/usr/apps/collectors/$red/log',60,'no',120,'yes',180,'yes'"
"'',198,1295520870,0,'ABC_INBOUND','$red','*$blue*','/usr/apps/$red/BR_ABC/ARCHIVE',60,'no',120,'no',180,'yes'"
"'',165,1293537000,0,'Logs - ABC','$white','*Log*.log','/usr/apps/collectors/$white/log',60,'no',120,'yes',180,'yes'"
"'',198,1295520870,0,'ABC_INBOUND','$white','*$black*','/usr/apps/$white/BR_ABC/ARCHIVE',60,'no',120,'no',180,'yes'"
$
$
$

tyler_durden

Last edited by durden_tyler; 01-20-2011 at 04:31 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Need help with for loops

Why wont my for statements work? Im trying to get this script to swich to a user an if you put in a start/stop/or restart paramater to do just that for each user. I commented out the actual start/stop actions to test it just by using echos and not do anything hasty in the environment but it... (0 Replies)
Discussion started by: LilyClaro
0 Replies

2. UNIX for Dummies Questions & Answers

loops with tr

Hello, I'm not sure if this is more appropriate for the 'unix for dummies' or the 'unix for experts' forum because I'm new to this forum and this is the second topic I've discussed, but if you could let me know which one was more appropriate for something like this, please do! So in tr (an... (2 Replies)
Discussion started by: juliette salexa
2 Replies

3. Shell Programming and Scripting

Loops

Hi All, I want to execute a script the number of times a user enters. Please can you advise on hor can I do the same. Many Thanks, Shazin (4 Replies)
Discussion started by: Shazin
4 Replies

4. Shell Programming and Scripting

Help with the 2 for loops

#!/bin/bash IFS=$'\n' A= a c b t g j i e d B= t y u i o p counter=0 found="" for i in $(cat $A) do for j in $(cat $B) do if then found="yes" fi done if then (1 Reply)
Discussion started by: vadharah
1 Replies

5. UNIX for Dummies Questions & Answers

Help with While Loops

I am traversing down a list, and I am not quite sure how to tell the loop to break when it's done going through the file. #!/bin/sh while : do read list <&3 echo $list done is the code. The file "list" is simply 5 4 3 2 1 any advice on how to break the loop after the file is... (1 Reply)
Discussion started by: MaestroRage
1 Replies

6. Shell Programming and Scripting

while loops

Hi I've a file like so: Now, I want to read my file and take ex. the Media ID and the Type for each groups of Media (Media1,Media2,...,Media(n): cat /tmp/file|\ while read FILE do while $(FILE|cut -d: -f1)=Media$i do #here will be some test, ex: #if Media ID < 23 ... (4 Replies)
Discussion started by: nymus7
4 Replies

7. UNIX for Dummies Questions & Answers

two loops

Hi, how can I use "for" to have two loops : this is my script : for i in (A B C) do for j in (a b c) do echo $i$j done done #End I want to print out Aa Ab Ac .... But I have error message : syntax error at line 1 : `(' unexpected Many thanks before. How should I use "for" ?? (2 Replies)
Discussion started by: big123456
2 Replies

8. UNIX for Dummies Questions & Answers

While Loops

I'm trying to create a loop that will prompt the user for 15 values, not forcing them to enter all 15. If the user enters through one or more of the prompts the null value needs to be converted to 0, otherwise set the parameter = to the value entered: ex. Please enter file no #1: 17920 ... (4 Replies)
Discussion started by: vdc
4 Replies

9. Shell Programming and Scripting

Loops within loops

I am running on HPUX using ksh. I have a script that uses a loop within a loop, for some reason the script seems to hang on a particuliar record. The record is fine and hits the condition in Blue. If I kill the 1st loop process the script continues on with no problem. Begin code> <Some... (8 Replies)
Discussion started by: bthomas
8 Replies

10. UNIX for Dummies Questions & Answers

loops?

hello....very new user to unix...and i have a question..i am not sure if there is such a thing For example...the user is asked if he likes Bananas....if he says yes.... echo You like Bananas $name at the end of the script it echos all that the user has entered so they can read it.... but... (1 Reply)
Discussion started by: jonas27
1 Replies
Login or Register to Ask a Question