Create multiple files from single file based on row separator


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Create multiple files from single file based on row separator
# 1  
Old 12-11-2015
Create multiple files from single file based on row separator

Hello ,

Can anyone please help me to solve the below -

Input.txt
Code:
source table abc
col1 char
col2 number
source table bcd
col1 date
col2 char

output should be 2 files based on the row separator "source table"

abc.txt

Code:
col1 char
col2 number

bcd.txt

Code:
col1 date
col2 char

Please suggest .

Thanks
# 2  
Old 12-11-2015
You have asked for our help 68 times before... What have you tried to solved this problem?

What operating system are you using?

What shell are you using?
# 3  
Old 12-11-2015
Done below -

Code:
#!/bin/sh

while read line
do
   if echo $line | grep source; then
       line_no=`echo $line | sed 's/source\([0-9]*\)/\1/g'`
   elif echo $line | grep END; then
       : #ignore
   else
       echo $line >> out.$line_no.txt
   fi
done < input_split.txt

Any smarter approach ?
# 4  
Old 12-11-2015
Well, How about this?

Code:
awk '/source/{file=$3".txt";next;}!/END/{print $0 >>file}' input_split.txt

-Ranga
# 5  
Old 12-11-2015
Quote:
Originally Posted by Pratik4891
Done below -

Code:
#!/bin/sh

while read line
do
   if echo $line | grep source; then
       line_no=`echo $line | sed 's/source\([0-9]*\)/\1/g'`
   elif echo $line | grep END; then
       : #ignore
   else
       echo $line >> out.$line_no.txt
   fi
done < input_split.txt

Any smarter approach ?
Your post #1 didn't say anything about ignoring lines containing the string END as the code above does, said you wanted output files abc.txt and bcd.txt instead of the files produced by the above code (out. table abc.txt and out. table bcd.txt), will convert any sequence of one or more spaces and/or tabs to a single space character (which is not what I expected from the sample you provided), and is processing a file named input_split.txt instead of the file Input.txt that you said you wanted to process.

To get something closer to what you said you wanted, you might try something more like:
Code:
#!/bin/sh
awk '
/^source table/ {
	if(fn)	close(fn)
	fn = $NF ".txt"
	next
}
{	print > fn
}' Input.txt

You didn't answer my question about what operating system you're using. If you're using a Solaris/SunOS system, change awk to /usr/xpg4/bin/awk or nawk.
# 6  
Old 12-11-2015
simple bash
Code:
while read -a arr ; do
if [ -n "${arr[2]}" ]
then x=${arr[2]}
else
echo ${arr[@]} >> "$x"
fi
done < file

. All these files need to be closed, but don't know where to put close
# 7  
Old 12-11-2015
Quote:
Originally Posted by looney
simple bash
Code:
while read -a arr ; do
if [ -n "${arr[2]}" ]
then x=${arr[2]}
else
echo ${arr[@]} >> "$x"
fi
done < file

. All these files need to be closed, but don't know where to put close
Unlike the open() system call (which opens the lowest available file descriptor), the shell file redirection operation >> "$x" closes standard output (file descriptor 1) if it is currently open and opens the file named by the expansion of $x as as file descriptor 1 with the append flag set.

If for some reason you are opening files with different file descriptors (instead of reusing a single file descriptor), you can close standard input with <&-, close standard output with >&-, close an input file using file descriptor n with n<&-, and close an output file using file descriptor n with n>&-.
This User Gave Thanks to Don Cragun For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Splitting single row into multiple rows based on for every 10 digits of last field of the row

Hi ALL, We have requirement in a file, i have multiple rows. Example below: Input file rows 01,1,102319,0,0,70,26,U,1,331,000000113200000011920000001212 01,1,102319,0,1,80,20,U,1,241,00000059420000006021 I need my output file should be as mentioned below. Last field should split for... (4 Replies)
Discussion started by: kotra
4 Replies

2. Shell Programming and Scripting

Split a single file into multiple files based on a value.

Hi All, I have the sales_data.csv file in the directory as below. SDDCCR; SOM ; MD6546474777 ;05-JAN-16 ABC ; KIRAN ; CB789 ;04-JAN-16 ABC ; RAMANA; KS566767477747 ;06-JAN-16 ABC ; KAMESH; A33535335 ;04-JAN-16 SDDCCR; DINESH; GD6674474747 ;08-JAN-16... (4 Replies)
Discussion started by: ROCK_PLSQL
4 Replies

3. Shell Programming and Scripting

awk Parse And Create Multiple Files Based on Field Value

Hello: I am working parsing a large input file which will be broken down into multiples based on the second field in the file, in this case: STORE. The idea is to create each file with the corresponding store number, for example: Report_$STORENUM_$DATETIMESTAMP , and obtaining the... (7 Replies)
Discussion started by: ec012
7 Replies

4. Shell Programming and Scripting

Converting a single row to multiple rows

Hi, I want to convert a single row values to multiple rows, but the no. of rows are not fixed. For example, I have a row as below abc-def-lmn-mno-xyz out put should be get abc get def get lmn get xyz (4 Replies)
Discussion started by: Suneel Mekala
4 Replies

5. Shell Programming and Scripting

Single command to create multiple empty files(no trailing lines as well).

Hi, i need a single command to create multiple empty files(no trailing lines as well) and empty the files if already existing. please let me know or if this has been ansered, if some ocan share the link please, thanks > newfile.txt or :> newfile.txt do not work (4 Replies)
Discussion started by: Onkar Banerjee
4 Replies

6. Shell Programming and Scripting

Subtracting each row from the first row in a single column file using awk

Hi Friends, I have a single column data like below. 1 2 3 4 5 I need the output like below. 0 1 2 3 4 where each row (including first row) subtracting from first row and the result should print below like the way shown in output file. Thanks Sid (11 Replies)
Discussion started by: ks_reddy
11 Replies

7. Shell Programming and Scripting

Combining multiple rows in single row based on certain condition using awk or sed

Hi, I'm using AIX(ksh shell). > cat temp.txt "a","b",0 "c",bc",0 "a1","b1",0 "cc","cb",1 "cc","b2",1 "bb","bc",2 I want the output as: "a","b","c","bc","a1","b1" "cc","cb","cc","b2" "bb","bc" I want to combine multiple lines into single line where third column is same. Is... (1 Reply)
Discussion started by: samuelray
1 Replies

8. Shell Programming and Scripting

duplicate row based on single column

I am a newbie to shell scripting .. I have a .csv file. It has 1000 some rows and about 7 columns... but before I insert this data to a table I have to parse it and clean it ..basing on the value of the first column..which a string of phone number type... example below.. column 1 ... (2 Replies)
Discussion started by: mitr
2 Replies

9. UNIX for Advanced & Expert Users

Create a file based on multiple files

Hey everyone. I am trying to figure out a way to create a file that will be renamed based off of one of multiple files. For example, if I have 3 files (cat.ctl, dog.ctl, and bird.ctl) that gets placed on to an ftp site I want to create a single file called new.cat.ctl, new.dog.ctl, etc for each... (3 Replies)
Discussion started by: coach5779
3 Replies

10. Shell Programming and Scripting

Split single file into multiple files based on the number in the column

Dear All, I would like to split a file of the following format into multiple files based on the number in the 6th column (numbers 1, 2, 3...): ATOM 1 N GLY A 1 -3.198 27.537 -5.958 1.00 0.00 N ATOM 2 CA GLY A 1 -2.199 28.399 -6.617 1.00 0.00 ... (3 Replies)
Discussion started by: tomasl
3 Replies
Login or Register to Ask a Question