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 &gt;&gt; $FILENAME\`
 fi

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

done

thanks
nbvcxzdz

hope this is useful... it outputs files 1.txt, 2.txt.......

gawk '/\.txt$/ { x++;next} {print > x".txt"}' < filename

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

#!/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

#!/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

awk '{print NR}' can get the line no.
that maybe you want.
e.g:

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

thanks guys but unfortunately i cannot assume each file has 3 lines of text, it can vary...does anyone know how to handle this?

You're close. Try:

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

UUOC

Use

while read LINE
do
  .
  .
  .
done < input_file

instead....

Cheers
ZB

thanks again everyone for their help ill try out the solution and get back to you

i have a slight problem there could be garbage at the top of the file that sould be completey ignored e.g

garbagge that should be ignored 1
garbagge that should be ignored 2
garbagge that should be ignored 3

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

current script

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

any ideas?

thanks