LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   Script Question: Spliting A File (https://www.linuxquestions.org/questions/programming-9/script-question-spliting-a-file-420669/)

tonyfreeman 03-01-2006 12:20 PM

Script Question: Spliting A File
 
Hello,

Here's a brain teaser for everyone. I have a file that has several sections in it that I need to split out into smaller files. Here is an example of such a file:

Code:

BLAH BLAH BLAH
BLAH

MORE BLAH MORE BLAH MORE BLAH
MORE BLAH MORE BLAH MORE BLAH

UPDATED BLAH

BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH

$$

MORE BLAH MORE BLAH MORE BLAH
MORE BLAH MORE BLAH MORE BLAH

UPDATED BLAH

BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH

$$

MORE BLAH MORE BLAH MORE BLAH
MORE BLAH MORE BLAH MORE BLAH

UPDATED BLAH

BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH

$$

MORE BLAH MORE BLAH MORE BLAH
MORE BLAH MORE BLAH MORE BLAH

UPDATED BLAH

BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH
BLAH BLAH BLAH BLAH BLAH BLAH BLAH BLAH

$$

BLAH

I need the stuff between the $$ as seperate files.

I'm going to tackle this using PHP but I was wondering if someone could provide a bash,gawk or perl way.

-- Tony


-- Tony

Mad Scientist 03-01-2006 02:02 PM

There is probably an easier way to do this, but here is a bash script I wrote that seems to accomplish the task. The script takes the name of the file you want to separate as an argument.

Code:

#!/bin/bash
# Separate single large file into multiple smaller files
# using $$ as the delimiter

INPUT=$1

if [ -z $INPUT ]; then
echo no argument was passed to the script
echo exiting...
exit 1
fi

if [ ! -e $INPUT ]; then
echo the filename passed does not exist
echo exiting...
exit 1
fi

FILES=`sed -n '/\$\$/ p' input | wc -l`

cp ${INPUT} ${INPUT}.orig
cp ${INPUT} ${INPUT}.cp

for i in `seq 0 ${FILES}`
do
sed -n '1,/\$\$/ p' $INPUT | sed -e '$ d' > ${INPUT}${i}
sed -e '1,/\$\$/ d' ${INPUT}.cp > $INPUT
cp $INPUT ${INPUT}.cp
done

cp ${INPUT}.orig ${INPUT}
rm -f ${INPUT}.cp ${INPUT}.orig

exit 0


tonyfreeman 03-01-2006 10:37 PM

Does exactly what I wanted!
 
Thanks a lot! I spent a huge portion of the day doing this in PHP ... your script does it much nicer and cleaner. Thanks!

kshkid 03-02-2006 01:55 AM

here's a much more simpler way,

Code:

# !/usr/bin/ksh

cnt=1

while read line
do
if [ "$line" = "\$\$" ]
then
echo "equal"
cnt=$(($cnt + 1))
else
echo $line >> file$cnt
fi
done < inputfile

exit 0


bigearsbilly 03-03-2006 09:22 AM

my go ;)
Code:

#!/usr/bin/perl -w
$/ = '$$';
@F = <>;

foreach $n (0..$#F) {
        print "writing: $n\n";
        open IN, ">$n" or die "cannee do $n:$!";
        print IN $F[$n];
}

file on command line or pipe

/bin/bash 03-04-2006 03:21 AM

Code:

#!/bin/bash
while [ "$(grep '\$\$' file)" ]
  do
  ((COUNT++))
  sed -n '1,/\$\$/p' file >file$COUNT
  sed -i '1,/\$\$/d' file
done

BTW kshkid ksh is EVIL! :p

kshkid 03-04-2006 03:35 AM

Quote:

BTW kshkid ksh is EVIL!
Absolutely, I cannot understand this,
could you please explain that?


All times are GMT -5. The time now is 04:49 AM.