Organize output with awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Organize output with awk
# 1  
Old 06-28-2018
Organize output with awk

Hello, maybe someone could help me with this.

I'm trying to print in a more ordered way this input.

the input file is:
Code:
AB   XY  UT   ZW                                      PRAT   
  0   3    4  7214800                                    93
  0   3    4  730770                                     93
         VLL  VMI  VKO  VER
          39         5

  0   1    4  7318                                       93
  0   2    4  87477                                     187
         VLL  VMI  VKO  VER
         102    7       0-0

  0   9    4  49365                                     185    
  0   1    4  5307                                       93

For some lines there are 2 related lines that contain "VLL VMI VKO VER" and in next line a corresponding value.
For example:
- The line where $4=730770 (header is ZW), has the value VLL=39 and VKO=5
- The line where $4=87477 has the value VLL=102, VMI=7 and VER=0-0

So, I would like to print this related values in the sale line when happens.

The output I'm looking for is like this:
Code:
AB   XY  UT   ZW                PRAT   VLL  VMI  VKO  VER 
  0   3    4  7214800              93
  0   3    4  730770               93   39         5
  0   1    4  7318                 93
  0   2    4  87477               187  102    7       0-0
  0   9    4  49365               185    
  0   1    4  5307                 93


I've was able to get this awk script but is far from desired output since basically is removing the lines with "VLL VMI VKO VER" and leaving the values in same place (in next line).

Code:
awk 'BEGIN{print "AB   XY  UT   ZW        PRAT    VLL  VMI  VKO  VER"}
NR>1 && $0!~"VLL" {print}
/VLL  VMI  VKO  VER/{getline v; print v}' inputfile

AB   XY  UT   ZW        PRAT    VLL  VMI  VKO  VER
  0   3    4  7214800                                    93
  0   3    4  730770                                     93
          39         5

  0   1    4  7318                                       93
  0   2    4  87477                                     187
         102    7       0-0

  0   9    4  49365                                     185
  0   1    4  5307                                       93

Thanks in advance
# 2  
Old 06-29-2018
Try something like this:
Code:
awk '{i=1} NR==1{print $1,$4; i=2}{print $i; print $(i+1), $(i+3)}' RS=  FS='\n' file

This User Gave Thanks to Scrutinizer For This Post:
# 3  
Old 06-29-2018
How about
Code:
awk '
NR == 1         {HD = "      VLL  VMI  VKO  VER"
                 printf "%s %s", $0, HD
                 next
                }
$0 ~ HD         {getline
                 printf "%s", $0
                 getline
                 next
                }
                {printf RS "%s", $0
                }
END             {printf RS
                }
' file
AB   XY  UT   ZW                                      PRAT          VLL  VMI  VKO  VER
  0   3    4  7214800                                    93
  0   3    4  730770                                     93          39         5
  0   1    4  7318                                       93
  0   2    4  87477                                     187         102    7       0-0
  0   9    4  49365                                     185    
  0   1    4  5307                                       93


Last edited by RudiC; 06-29-2018 at 09:27 AM..
# 4  
Old 06-29-2018
Hello Scrutinizer and RudiC,

Thanks for the help. I noticed something I didn't considered. If I want to pass the output for example to Excel and I say the delimiter is space, the values for VLL, VMI, VKO, VER are located in wrong columns when for example VMI or VKO is empty in input file. Can be added an output delimiter to your solutions?

Thanks again
# 5  
Old 06-29-2018
Sliding in an output delimiter is not a difficult task, but finding empty fields in the input when the input delimiters are a couple of spaces, and the input fields are space padded, too, is NOT a deterministic task. In this case, I'll take 5 spaces (two as field delimiters, three for field width) as an empty field identifier, but YMMV. Try
Code:
awk '
NR == 1         {HD = " VLL  VMI  VKO  VER"
                 $0 = $0 HD
                 $1 = $1
                 printf "%s", $0
                 next
                }
$0 ~ HD         {getline
                 sub (/^ */, _)
                 gsub (/     /, OFS)
                 $1 = $1
                 printf OFS "%s", $0
                 getline
                 next
                }
                {$1 = $1
                 printf RS "%s", $0
                }
END             {printf RS
                }
' OFS="," file
AB,XY,UT,ZW,PRAT,VLL,VMI,VKO,VER
0,3,4,7214800,93
0,3,4,730770,93,39,,5
0,1,4,7318,93
0,2,4,87477,187,102,7,,0-0
0,9,4,49365,185
0,1,4,5307,93

This User Gave Thanks to RudiC For This Post:
# 6  
Old 06-29-2018
Quote:
Originally Posted by RudiC
Sliding in an output delimiter is not a difficult task, but finding empty fields in the input when the input delimiters are a couple of spaces, and the input fields are space padded, too, is NOT a deterministic task. In this case, I'll take 5 spaces (two as field delimiters, three for field width) as an empty field identifier, but YMMV.
Thanks again RudiC. It works with the sample file but as you said different results could be obtained. Trying other input the output is not correct for some values of 4 last columns, but I understand the reason you explain. The input is not clearly determined in its fields so is difficult to parse it.

I think I could use your 3 solutions and manually separate the values in 4 last columns.

Many thanks for your help.

---------- Post updated at 01:37 PM ---------- Previous update was at 12:22 PM ----------

Hello RudiC,

May you explain me please how this part of your first solution works?

Code:
$0 ~ HD   {getline
           printf "%s", $0
           getline
           next
           }
          {printf RS "%s", $0}
'

I understand with getline reads the next line after the matched string, but I don't see clear how if you already printed a line after the first getline, then why you apply another getline and a next and how you arrange the correct output with another print.

Thanks again.
# 7  
Old 06-29-2018
Look at lines 4 - 6 in your sample in post#1:


Code:
.
.
.
VLL  VMI  VKO  VER        # $0 ~ HD   {getline  --> found the header (HD); discard and read new line
      39         5        #            printf "%s", $0
                          #            getline  --> empty line; skip with getline
                          #            next     --> go read  and process next input line

This User Gave Thanks to RudiC For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Is there a way to organize bash_profile across different platforms

I want to have one .bash_profile works on multiple platform, ubuntu, debian, redhat, cygwin, osx. So how should I organize .bash_profile? It can be multiple files in some subdir Let me brief you: what i want is a way to organize bash_profile across platforms so I can use one set of profiles... (2 Replies)
Discussion started by: John_Peter
2 Replies

2. Shell Programming and Scripting

Discover unique names and organize

I'm attempting to write a script that will look into a directory, discover all unique names, create directories for their prefix names and place the files inside. I do this now one by one with a simple script but I'd like to automate the process. The directory would contain something like: ... (6 Replies)
Discussion started by: scribling
6 Replies

3. Shell Programming and Scripting

Organize file according to their extension

Hi Everyone ! i want to make an application which is written in shell script and in Bourne shell (sh) i want, when my script is executed, it read all the files in the directly and move them to folders according to their extension. suppose i have a files: test.txt test.jpg test.docx... (1 Reply)
Discussion started by: me_newbie
1 Replies

4. Shell Programming and Scripting

need help for a script to organize data

Hey all, I have a file with info like this 12:05:44 DEV001 (15F6) 71 5 1372 131 58 100 6 0 17 DEV002 (15FA) 60 0 928 15 50 N/A 2 N/A 5 DEV003 (15FE) 77 2 961 59 51 100 1 0 2... (2 Replies)
Discussion started by: leo.maveriick
2 Replies

5. UNIX and Linux Applications

Organize (pretty) code

I'm looking for terminal programs, which organize and pretty code like HTML or JavaScript. Thanks! ---------- Post updated at 07:01 AM ---------- Previous update was at 01:49 AM ---------- Found this Online javascript beautifier (1 Reply)
Discussion started by: borobudur
1 Replies

6. Shell Programming and Scripting

Organize of Data

Hello Expert, I am new in awk. I would like to know how to arrange data like Input File: lpar1 1 2 3 4 5 6 lpar10 4 5 6 lpar3 4 5 (3 Replies)
Discussion started by: shah09
3 Replies

7. Shell Programming and Scripting

how organize my log file ( tabs )

hello i have written a multitask script which performs verifications on the server (RHEL 5 tikanga); based on list of rules. since the results are huge both in length and number and I am sending them all to my log file. Is there any method to organize the STATUS of my results in a defined... (1 Reply)
Discussion started by: goswami.c
1 Replies

8. Shell Programming and Scripting

looking for a simple way to organize envs on our unix box...

would like to standardize how we set envs on our unix box, so I thought a menu would be a great way to accomplish this. The problem I'm experiencing, is the value is set...but ONLY during the time the menu is initiated. please see below: > /home/is/bin/r12MENU.sh ... (2 Replies)
Discussion started by: mr_manny
2 Replies

9. UNIX for Dummies Questions & Answers

How do I organize a series of files in date order?

I'd like to ls a group of files in date order but I'm not sure what the commands would be. Can anyone help with this? (1 Reply)
Discussion started by: hedgehog001
1 Replies
Login or Register to Ask a Question