Using Grep in a Shell Script | Unix Linux Forums | Shell Programming and Scripting

  Go Back    


Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

Using Grep in a Shell Script

Shell Programming and Scripting


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 03-16-2005
nbvcxzdz nbvcxzdz is offline
Registered User
 
Join Date: Dec 2003
Last Activity: 14 November 2005, 3:43 PM EST
Posts: 17
Thanks: 0
Thanked 0 Times in 0 Posts
Using Grep in a Shell Script

Hi everyone,

Im trying to write a Shell script that basically creates a set of files based on a file with many records. For example if a file called dummy has the following content:

a.txt
1st line of a's text file
2nd line of a's text file
3rd line of a's text file
b.txt
1st line of b's text file
2nd line of b's text file
3rd line of b's text file

After running my shell script, 2 files should be created. The first should be called a.txt and its contents should be:
1st line of a's text file
2nd line of a's text file
3rd line of a's text file

The second file created should be called b.txt and its contents should be:
1st line of b's text file
2nd line of b's text file
3rd line of b's text file

So essentialy the name of the file is followed by its content in dummy. I've attempted to write a script to do this but ive being having problems getting it to work. If someone has done this before using similar code or completely different code could you please help me out? I think i have some error in my grep line and also other minor errors. My shell script code
is as follows:

#look at one line at a time in dummy file
line_number=1
#number of lines in file, temporarliy set to 9 but should be whatever the #number of lines in the file is
LENGTH=9

while [ $line_number -le $LENGTH ]
do
$current_line=`tail +$line_number < dummy|head -n$line_number|cat`

if [ grep ".txt" $current_line ]
then
FILENAME=$current_line
else
`echo $current_line >> $FILENAME`
fi

#$line_number='exp $line_number + 1'
line_number=`expr $line_number+1`
done




thanks
nbvcxzdz
Sponsored Links
    #2  
Old 03-16-2005
tanku tanku is offline
Registered User
 
Join Date: Mar 2005
Last Activity: 31 March 2005, 1:56 PM EST
Posts: 53
Thanks: 0
Thanked 0 Times in 0 Posts
hope this is useful... it outputs files 1.txt, 2.txt.......

gawk '/\.txt$/ { x++;next} {print > x".txt"}' < filename
Sponsored Links
    #3  
Old 03-16-2005
zazzybob's Avatar
zazzybob zazzybob is offline Forum Advisor  
Registered Geek
 
Join Date: Dec 2003
Last Activity: 13 May 2013, 9:02 AM EDT
Location: Melbourne, Australia
Posts: 2,185
Thanks: 3
Thanked 24 Times in 23 Posts
So each file has a consistent number of lines, right?

The following (g)awk program will do the trick. Just set the modulus to whatever you need (i.e. if the filenames appear every 5 lines change the modulus to $0 % 5). Save this as whatever.awk and make executable, then invoke with
$ ./whatever.awk input_file

Code:
#!/usr/bin/gawk -f

BEGIN { FS="\n" }

{ if ( $0 % 4 == 0 ) {
  filename = $0
} else {
  print $0 >> filename
} }


Here's a way of doing it using bash

Code:
#!/bin/bash

current_line=0
# file_length is the number of lines in each "file"
# excluding the n.txt lines....
file_length=3

while read line; do
  if [ $(( current_line % ( file_length + 1 ) )) -eq "0" ]; then
     filename="$line"
  else
     echo "$line" >> $filename
  fi
  (( current_line = current_line + 1 ))
done < input_file

Cheers
ZB
    #4  
Old 03-16-2005
ZealeS ZealeS is offline
Registered User
 
Join Date: Mar 2005
Last Activity: 19 December 2007, 4:13 AM EST
Posts: 29
Thanks: 0
Thanked 0 Times in 0 Posts
awk '{print NR}' can get the line no.
that maybe you want.
e.g:

Code:
bash-2.05$ awk '{if(NR==1)od="st";else if(NR==2)od="nd";else if(NR==3)od="rd";else od="th";print NR""od" line of file a";}' a.txt
1st line of file a
2nd line of file a
3rd line of file a
4th line of file a
5th line of file a
6th line of file a
7th line of file a

Sponsored Links
    #5  
Old 03-16-2005
nbvcxzdz nbvcxzdz is offline
Registered User
 
Join Date: Dec 2003
Last Activity: 14 November 2005, 3:43 PM EST
Posts: 17
Thanks: 0
Thanked 0 Times in 0 Posts
thanks guys but unfortunately i cannot assume each file has 3 lines of text, it can vary...does anyone know how to handle this?
Sponsored Links
    #6  
Old 03-16-2005
gsatch gsatch is offline
Registered User
 
Join Date: Jun 2002
Last Activity: 29 January 2013, 11:01 AM EST
Location: Irvine, CA
Posts: 21
Thanks: 0
Thanked 0 Times in 0 Posts
You're close. Try:

Code:
cat <file> |while read LINE
do
   if [ "`echo ${LINE} |grep '.txt'$`" != "" ] ; then
      FILENAME=${LINE}
      continue
   fi
   echo ${LINE} >> ${FILENAME}
done

Sponsored Links
    #7  
Old 03-16-2005
zazzybob's Avatar
zazzybob zazzybob is offline Forum Advisor  
Registered Geek
 
Join Date: Dec 2003
Last Activity: 13 May 2013, 9:02 AM EDT
Location: Melbourne, Australia
Posts: 2,185
Thanks: 3
Thanked 24 Times in 23 Posts
UUOC

Use

Code:
while read LINE
do
  .
  .
  .
done < input_file

instead....

Cheers
ZB
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Grep in Shell script ap2112 Shell Programming and Scripting 5 01-20-2011 10:38 AM
Shell Script with Grep DallasT Shell Programming and Scripting 2 06-02-2010 11:55 AM
How to grep sql error in shell script and exit the script? allinshell99 Shell Programming and Scripting 2 05-27-2010 09:06 PM
Shell script grep help shriyer Shell Programming and Scripting 11 08-03-2009 11:35 AM
grep in Shell script Krishnaramjis Shell Programming and Scripting 1 02-19-2008 08:43 PM



All times are GMT -4. The time now is 01:44 PM.