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