Script to combine lines in a file


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Script to combine lines in a file
# 1  
Old 04-26-2017
Script to combine lines in a file

Greetings,
I have large file with following format

Code:
name1 name2
name3 name4
name5 name6
 child7 child8 child9                      <== there is leading blank space
 child10 child11 child12                 <== there is leading blank space
name13 name14
name15 name16
 child17 child18 child19                 <== there is leading blank space
name20 name21
 child22 child23 child24                 <== there is leading blank space
 child25 child26 child27                 <== there is leading blank space
 child28 child29 child30                 <== there is leading blank space

Need a script to convert to the following:

Code:
name1 name2
name3 name4
name5 name6 child7 child8 child9
name5 name6 child10 child11 child12
name13 name14
name15 name16 child17 child18 child19
name20 name21 child22 child23 child24
name20 name21 child25 child26 child27
name20 name21 child28 child29 child30

Basically, there is a "leading space" in the "child" line. When ever found, loop through to print with parent "name" to create above output. If no "child" just print the parent "name".

Any help appreciated. Thank you very much.


Moderator's Comments:
Mod Comment Please use CODE tags as required by forum rules!

Last edited by RudiC; 04-26-2017 at 08:15 AM.. Reason: leading blank space in the "child" line not displayed; RudiC: Added CODE tags.
# 2  
Old 04-26-2017
Any attempts / ideas / thoughts from your side?
# 3  
Old 04-26-2017
With my simple knowledge of using 'awk', I can combine two lines, but unable to script a loop to print the parent line along with each child line found. Potentially there several 'child' lines which needs to be combined with parent line. Thanks.
# 4  
Old 04-26-2017
Here is an approach:-
Code:
 
 awk '
        {
                if ( /^ /  && p )
                {
                        print p, $0
                        A[p]
                }
                else if ( ! ( p in A ) && p )
                        print p
        }
        !/^ / {
                p = $0
        }
' file

# 5  
Old 04-26-2017
Awesome Yoda.
Yesterday I gave up on AWK and wrote a BASH script this morning. In Bash, with the loops construct, it was taking about 2min to execute for the sample set of 1000 records. But your awk script done executing in blink of an eye.
Thank you very much.

However, upon verification, looks like the last line is not getting printed. Please check it out.

Please recommend a good AWK manual/user guide to get.
Thanks again.
# 6  
Old 04-26-2017
Quote:
Originally Posted by rnnyusa
However, upon verification, looks like the last line is not getting printed. Please check it out..
For handling last line, add an END rule:-
Code:
awk '
        {
                if ( /^ /  && p )
                {
                        print p, $0
                        A[p]
                }
                else if ( ! ( p in A ) && p )
                        print p
        }
        !/^ / {
                p = $0
        }
        END {
                if ( ! ( p in A ) && p )
                        print p
        }
' file

Quote:
Originally Posted by rnnyusa
Please recommend a good AWK manual/user guide to get.
The GNU Awk User’s Guide
# 7  
Old 04-26-2017
Try also
Code:
awk '!/^ / {printf "%s%s", F?ORS:"", TMP0 = $0; F = 1; next} {printf "%s%s" ORS, F?"":TMP0, $0; F = 0}' file
name1 name2
name3 name4
name5 name6 child7 child8 child9
name5 name6 child10 child11 child12
name13 name14
name15 name16 child17 child18 child19
name20 name21 child22 child23 child24
name20 name21 child25 child26 child27
name20 name21 child28 child29 child30

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk to combine matching lines in file

I am trying to combine all matching lines in the tab-delimited using awk. The below runs but no output results. Thank you :). input chrX 110925349 110925532 ALG13 chrX 110925349 110925532 ALG13 chrX 110925349 110925532 ALG13 chrX 47433390 47433999 SYN1... (3 Replies)
Discussion started by: cmccabe
3 Replies

2. Shell Programming and Scripting

Program to combine two lines in a file on checking the first character of each line

Hi, I have a requirement where I need to combine two lines in a file based on first character of each line in a file. Please find the sample content of the file below: _______________________ 5, jaya, male, 4-5-90, single smart 6, prakash, male, 5-4-84, married fair 7, raghavi, female,... (12 Replies)
Discussion started by: jayaP
12 Replies

3. UNIX for Advanced & Expert Users

Need to combine two lines in a file based on first character of each line in a file

Hi, I have a requirement where I need to combine two lines in a file based on first character of each line in a file. Please find the sample content of the file below: Code: _______________________ 5, jaya, male, 4-5-90, single smart 6, prakash, male, 5-4-84, married fair 7, raghavi,... (1 Reply)
Discussion started by: jayaP
1 Replies

4. UNIX for Dummies Questions & Answers

Need to combine two lines in a file based on first character of each line in a file

Hi, I have a requirement where I need to combine two lines in a file based on first character of each line in a file. Please find the sample content of the file below: Code: _______________________ 5, jaya, male, 4-5-90, single smart 6, prakash, male, 5-4-84, married fair 7, raghavi,... (1 Reply)
Discussion started by: jayaP
1 Replies

5. UNIX for Dummies Questions & Answers

Combine lines in file

Hi All, I am trying to understand if its possible to carry out the following. I have a text file which contains output from multiple commands, within the file a node will be quiered twice if there was 2 commands for example. Is it possible do combine 2 lines into 1 if the first word is the... (1 Reply)
Discussion started by: mutley2202
1 Replies

6. Shell Programming and Scripting

Combine multiple unique lines from event log text file into one line, use PERL or AWK?

I can't decide if I should use AWK or PERL after pouring over these forums for hours today I decided I'd post something and see if I couldn't get some advice. I've got a text file full of hundreds of events in this format: Record Number : 1 Records in Seq : ... (3 Replies)
Discussion started by: Mayday22
3 Replies

7. UNIX for Dummies Questions & Answers

Combine lines from file

Hello, Input file looks like this: apples bananas oranges and rice pears cherries mango I want output to look like this: apples bananas oranges and rice pears cherries mango It should combine line 1 with line 2 and line 3 with line 4 like that.... Right now, only way I can... (4 Replies)
Discussion started by: holyearth
4 Replies

8. Shell Programming and Scripting

Combine multiple lines in file based on specific field

Hi, I have an issue to combine multiple lines of a file. I have records as below. Fields are delimited by TAB. Each lines are ending with a new line char (\n) Input -------- ABC 123456 abcde 987 890456 7890 xyz ght gtuv ABC 5tyin 1234 789 ghty kuio ABC ghty jind 1234 678 ght ... (8 Replies)
Discussion started by: ratheesh2011
8 Replies

9. Shell Programming and Scripting

Combine all lines of a file with all lines of another file.

Dear all, I would like to combine all lines of a file with all lines of another file: The input are file 1 A B C D file 2 A B C D The output is final file A_A A_B A_C (3 Replies)
Discussion started by: valente
3 Replies

10. UNIX for Dummies Questions & Answers

How do I combine the last 2 lines of a file

I tried to put the history line number and the date into the file with one command, and failed. Can't figure out how to get the date variable substituted for the last space captured. history | tail -1 | sed -e 's/.\{7\}/&/g' | head -1 | sed 's/ $/$date/' Result was: 729 $date So, I... (8 Replies)
Discussion started by: jimbob75
8 Replies
Login or Register to Ask a Question