Combine two parts of a file


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Combine two parts of a file
# 1  
Old 08-28-2013
Combine two parts of a file

Hello All,

I have a file like this

Code:

APPLY
( 'INSERT INTO brdcst_media_cntnt (
  cntnt_id
 ,brdcst_media_cntnt_cd
 ,cntnt_prvdr_cd
 ,data_src_type_cd
 ,cntnt_titl_nm
 ,cntnt_desc
 ,batch_dt
 ,batch_id
 ) VALUES
(
  :cntnt_id
 ,:brdcst_media_cntnt_cd
 ,:cntnt_prvdr_cd
 ,:data_src_type_cd
 ,:cntnt_titl_nm
 ,coalesce(:cntnt_desc,'' '')
 ,CAST(SUBSTR(' || @BatchId || ',1,8) as DATE FORMAT ''YYYYMMDD'')
 ,CAST(substr(' || @BatchId || ',11,1) as INTEGER)
 );'
)

I want to extract the first highlighted in green and then adjacent to it i need the text highlighted in orange removing the ':'
Also, the name of the column it is adjacent to should be changed with incremental t1,12,13 values
So the output should be like this

Code:
cntnt_id as t1
 ,brdcst_media_cntnt_cd as t2 
 ,cntnt_prvdr_cd as t3
 ,data_src_type_cd as t4 
 ,cntnt_titl_nm as t5
 ,cntnt_desc as coalesce(t6,'' '')
 ,batch_dt as CAST(SUBSTR(' || @BatchId || ',1,8) as DATE FORMAT
 ,batch_id as CAST(substr(' || @BatchId || ',11,1) as INTEGER)

I tried getting the highlighted text using this code
Code:
 awk '/APPLY/ {t=1} f && /\)/{exit} f; /\(/ && t {f=1}'  filename

Getting the second highlighted text in orange color
Code:
awk 'BEGIN{x=1} /VALUES/,/\)\;/ {if (NF==1) { $2="as t"x"" ;print; x++ }}' filename

But I could not get it adjacent to each other with "as" between them.
Please help me out.

---------- Post updated at 08:19 PM ---------- Previous update was at 04:48 PM ----------

How can i get both the output adjacent to each other with incremental values of t1,t2,t3
# 2  
Old 08-29-2013
Try this:

Code:
awk '
/INSERT/{
  i=v=$0;

  # Produce Fields list into i with ; separator
  gsub(/.*INSERT[^(]*[(][ \n]*/,"",i);
  gsub(/ *[)] *VALUES[^(]*[(].*$/,"",i);
  gsub(/\n *,/,";",i);
  gsub(/[ \n]*$/,"",i);

  # Produce values list into v with ; separator
  gsub(/.*VALUES[^(]*[(][ \n]*/,"",v);
  gsub(/) *$/,"",v);
  gsub(/ *\n *,/,";",v);
  gsub(/[ \n]*$/,"",v);

  # split i and v into field[] and value[]
  vals=split(i,field,";")
  split(v,value,";")

  for(t=1;t<=vals;t++) {
     # Replace :fieldname with t<N>
     gsub(":"field[t], "t"t, value[t]);
     print field[t] " as " value[t]
  }} ' RS=\; infile


Last edited by Chubler_XL; 08-29-2013 at 01:01 AM.. Reason: Added comments
# 3  
Old 08-29-2013
Hello Chubler_XL,

Thank you so much for the awesome reply.
It works exactly how I wanted.

Is there anyway we could add this into the snippet

After the apply keyword, there can be some other keywords like UPDATE below it instead of INSERT like this

Code:
APPLY

'
UPDATE



;',
'
( 'INSERT INTO brdcst_media_cntnt (
  cntnt_id
 ,brdcst_media_cntnt_cd
 ,cntnt_prvdr_cd
 ,data_src_type_cd
 ,cntnt_titl_nm
 ,cntnt_desc
 ,batch_dt
 ,batch_id
 ) VALUES
(
  :cntnt_id
 ,:brdcst_media_cntnt_cd
 ,:cntnt_prvdr_cd
 ,:data_src_type_cd
 ,:cntnt_titl_nm
 ,coalesce(:cntnt_desc,'' '')
 ,CAST(SUBSTR(' || @BatchId || ',1,8) as DATE FORMAT ''YYYYMMDD'')
 ,CAST(substr(' || @BatchId || ',11,1) as INTEGER)
 );'
)

How can eliminate the update part out of this awk, I just need the INSERT and VALUES part as it is doing now.
# 4  
Old 08-29-2013
It should already ignore the UPDATE part of the input file. I'm confused about what you want here. Can you post example input and output files for you new requirement.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Split a file into parts only if the first field is different

Hi, I have a file like this: aaa 123 aaa 223 aaa 225 bbb 332 bbb 423 bbb 6755 bbb 324 ccc 112 ccc 234 ccc 897 Which I need to split into several files, something like split -l 3 but the way that the lines with the same names would only go into one file: (7 Replies)
Discussion started by: coppuca
7 Replies

2. Shell Programming and Scripting

Split file into n parts.

Hi all: I have a 5-column tab-separated file. The only thing that I want to do with it is to split it. However, I want to split it with a 80/20 proportion -- randomized, if possible. I know that something like : awk '{print $0 ""> "file" NR}' RS='' input-file will work, but it only... (6 Replies)
Discussion started by: owwow14
6 Replies

3. Shell Programming and Scripting

Incrementing parts of ten digits number by parts

I have number in file which contains date and serial number: 2013101000. The last two digits are serial number (00). So maximum of serial number is 100. After reaching 100 it becomes 00 with incrementing 10 which is day with max 31. after reaching 31 it becomes 00 and increments 10... (31 Replies)
Discussion started by: Natalie
31 Replies

4. Shell Programming and Scripting

Extract Parts of File

Hello All, I have a file like this Define schema flat_file_schema ( a varchar(20) ,b varchar(30) ,c varchar(40) ); (Insert into table ( a ,b ,c ) values ( 1 ,2 ,3 ); (4 Replies)
Discussion started by: nnani
4 Replies

5. UNIX for Dummies Questions & Answers

Help with deleting some parts from text file

Hi all, I have a fat file which contains something like this: ************************************************ blahblahblah blahblahblah Myobject1 HOME ( homecontents01 ( some junk; ) home contents02( some junk; ) ... (7 Replies)
Discussion started by: newboy
7 Replies

6. Shell Programming and Scripting

extract certain parts from a file

I have a logfile from which i need to extract certain pattern based on the time but the problem here is the time is not same for all days. Input file: Mon 12:34:56 abvjingjgg Mon 12:34:57 ofjhjgjhgh . . . Mon 22:30:00 kkfng . . . Mon 23:12:23 kjgsdafhkljf . . . Tue 01:04:54... (8 Replies)
Discussion started by: gpk_newbie
8 Replies

7. UNIX for Dummies Questions & Answers

How to swap parts of a file name?

I have a number of files that a structured like this: Eg. file_name.ext1 another file name with spaces.ext2 yatf with .ext3 also a file (plus).ext4 I would like to swap the part with the descriptive_file_name part, so that it looks like this: Eg. file_name .ext1 I know (or... (4 Replies)
Discussion started by: invenio
4 Replies

8. Shell Programming and Scripting

Extracting parts of a file.

Hello, I have a XML file as below and i would like to extract all the lines between <JOB & </JOB> for every such occurance. The number of lines between them is not fixed. Anyways to do this awk? ============ <JOB APR="1" AUG="1" DEC="1" FEB="1" JAN="1" JUL="1" JUN="1" MAR="1" MAY="1"... (3 Replies)
Discussion started by: srivat79
3 Replies

9. Shell Programming and Scripting

getting parts of a file

Hello, I'm trying to retreive certain bits of info from a file. the file contains a list like this info1:info2:info3:info4 info1:info2:info3:info4 info1:info2:info3:info4 info1:info2:info3:info4 how do i pick out only info2 or only info3 without the others? Thanks (11 Replies)
Discussion started by: bebop1111116
11 Replies

10. UNIX for Dummies Questions & Answers

cksum parts of a file

Every time we build an executable the date and time are put into the file, I need to run checksum on just the working lines.(IE, no header files) Is this even possible, if so how would I go about it? I am using a HP-UX server any help you can give me will be greatly appreciated. Thanks (6 Replies)
Discussion started by: crazykelso
6 Replies
Login or Register to Ask a Question