Visit Our UNIX and Linux User Community


AWK Multi-Line Records Processing


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting AWK Multi-Line Records Processing
# 8  
Old 10-18-2007
I was afraid it might be something like that, and unfortunately all the fields are separated by spaces, not tabs. Furthermore, while column 3 has the dollar sign because it is a currency amount, there are other columns where there will be no value like the dollar sign to check if a condition is true or not.

I guess i might have to try something like:

BEGIN {OFS=":"}
col1=substr($0,1,9)
col2=substr($0,10,8)
col3=substr($0,21,10)
etc....

Thanks for the help you have given me up to this point. I could have not gotten this far without it.
# 9  
Old 10-18-2007
try something like this (ran against the data above - don't know if I can get this fond to be non-proportional, but try running against the data you showed above.

awk -F: '! /^$/{
nf=split($1, X, " ")
if (X[4] ~ /\$/)
{
printf("%s %5s %-6s %7s %4s %4s %3s %3s %3s %3s %3s %3s %5s %5s %10s %2s", X[1], X[2], X[3], X[4], X[5], X[6],
X[7], X[8], X[9], X[10], X[11], X[12], X[13], X[14], X[15], X[16] )
}
else
{
printf("%s %5s %-6s %-7s %4s %4s %3s %3s %3s %3s %3s %3s %5s %5s %10s %2s", X[1], X[2], X[3], " " , X[4], X[5], X[6],
X[7], X[8], X[9], X[10], X[11], X[12], X[13], X[14], X[15])
}

printf("%3s %3s %5s %3s %3s %3s %3s %3s\n", $2, $3, $4, $5, $6, $7, $8, $9)
}'

Not sure what you are expecting, but I got this - still see some errors to clean up.

FEB 20-98 VLY 1041 2094 8 8 8 8 8 8 NB SMITH GW - - LAPS 8 40 - - 1
JAN 7-98 VLY 1030 2064 6 3 3 4 4 3 2071 NB SMITH GW - - LAPS 6 40 - - 1
MAR 9-98 VLY $500 1024 2060 5 2 3 4 2 2 2063 1900 SMITH GW - - LAPS 8 36 - - 1
MAR 13-98 VLY $1,350 1004 2022 2 3 2 2 1 1 2022 1130 SARAMA GW - - LAPS 7 31 - - 2
MAR 27-98 VLY $675 1013 2020 4 1 1 1 1 2 2020 *1750 SMITH GW - - LAPS 8 60 - - 2
MAY 1-98 VLY $1,500 0594 1594 2 1 1 1 1 1 1594 *9500 SMITH GW - - LAPS 7 70 - - 9
MAY 9-98 HILL $2,000 0581 1570 1 6 5 4 2 1 1570 *2200 SMITH GW - - LAPS 7 60 - - 8
MAY 15-98 HILL 1003 2011 7 8 8 8 8 8 *265 SMITH GW - - LAPS 8 75 - - 9
MAY 21-98 HILL 0593 2010 7 8 8 8 8 8 9550 SMITH GW - - LAPS 9 46 - - 2
FEB 22-98 VLY $675 1013 2020 4 1 1 1 1 2 2020 *1750 SMITH GW - - LAPS 8 60 - - 3
APR 3-98 VLY $675 1001 2011 3 2 2 3 3 2 2011 *1550 SMITH GW - - LAPS 6 45 - - 5
MAR 8-99 VLY $500 1024 2060 5 2 3 4 2 2 2063 1900 SMITH GW - - LAPS 8 36 - - 10
MAR 13-99 VLY $1,350 1004 2022 2 3 2 2 1 1 2022 1130 SMITH GW - - LAPS 7 31 - - 7
AUG 25-98 RIDC 1011 2011 9 4 3< 3< 7 7 2024 820 MILLER TF - - MILE 9 69 - - 6
# 10  
Old 10-18-2007
That is pretty darn close to working!

For me on my machine it returned:
Code:
FEB 20-98 VLY            1041 2094   8   8   8   8   8   8    NB SMITH         GW    -   -  LAPS   8   40   -   -    1
JAN  7-98 VLY            1030 2064   6   3   3   4   4   3  2071    NB      SMITH GW -   -  LAPS   6   40   -   -    1
MAR  9-98 VLY       $500 1024 2060   5   2   3   4   2   2  2063  1900      SMITH GW -   -  LAPS   8   36   -   -    1
MAR 13-98 VLY     $1,350 1004 2022   2   3   2   2   1   1  2022  1130     SARAMA GW -   -  LAPS   7   31   -   -    2

The only trip-up was the first record where there was a blank/no value after the last 8 so the NB SMITH etc. should be over one column but with what you have given me i should be able to work that out.

If not i'll be back with more questions Smilie Thanks again for all your help and direction.
# 11  
Old 10-18-2007
CPU & Memory

Code:
BEGIN {
  RS = "" ; FS = "\n"
  split( "%s|%7s| : %-9s| : %9s| : %s" \
         "| : %s| : %s| : %s", format, "|" )
}

{ if ( $1 !~ /\(CONT\)/ )
    print ""
  for (i=4; i<=NF; i+=2 )
    process( $i )
}

function process( line,       a, i )
{ split( line, a, " " )
  if ( length(a)==29)
    insert( a, 12, "" )
  if ( length(a) == 30 )
    insert( a, 4, "" )
  for (i=1; i<=length(format); i++)
    printf format[i], a[i]
  print ""
}

function insert( a, where, what,      i )
{ for ( i = length(a); i >= where; i-- )
    a[i+1] = a[i]
  a[where] = what
}


Previous Thread | Next Thread
Test Your Knowledge in Computers #183
Difficulty: Easy
Over 40% of UNIX.com users voted that bash was their most useful shell.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Help with reformat single-line multi-fasta into multi-line multi-fasta

Input File: >Seq1 ASDADAFASFASFADGSDGFSDFSDFSDFSDFSDFSDFSDFSDFSDFSDFSD >Seq2 SDASDAQEQWEQeqAdfaasd >Seq3 ASDSALGHIUDFJANCAGPATHLACJHPAUTYNJKG ...... Desired Output File >Seq1 ASDADAFASF ASFADGSDGF SDFSDFSDFS DFSDFSDFSD FSDFSDFSDF SD >Seq2 (4 Replies)
Discussion started by: patrick87
4 Replies

2. Shell Programming and Scripting

awk - Multi-line data to be stored in variable

Greetings Experts, As part of automating the sql generation, I have the source table name, target table name, join condition stored in a file join_conditions.txt which is a delimited file (I can edit the file if for any reason). The reason I needed to store is I have built SELECT list without... (5 Replies)
Discussion started by: chill3chee
5 Replies

3. Shell Programming and Scripting

[awk] line by line processing the same file

Hey, not too good at this, so I only managed a clumsy and SLOW solution to my problem that needs a drastic speed up. Any ideas how I write the following in awk only? Code is supposed to do... For every line read column values $6, $7, $8 and do a calculation with the same column values of every... (6 Replies)
Discussion started by: origamisven
6 Replies

4. Shell Programming and Scripting

Multi-line filtering based on multi-line pattern in a file

I have a file with data records separated by multiple equals signs, as below. ========== RECORD 1 ========== RECORD 2 DATA LINE ========== RECORD 3 ========== RECORD 4 DATA LINE ========== RECORD 5 DATA LINE ========== I need to filter out all data from this file where the... (2 Replies)
Discussion started by: Finja
2 Replies

5. Shell Programming and Scripting

Transpose multi-line records into a single row

Now that I've parsed out the data that I desire I'm left with variable length multi-line records that are field seperated by new lines (\n) and record seperated by a single empty line ("") At first I was considering doing something like this to append all of the record rows into a single row: ... (4 Replies)
Discussion started by: daveyabe
4 Replies

6. UNIX for Dummies Questions & Answers

Alphabetical sort for multi line records contains in a single file

Hi all, I So, I've got a monster text document comprising a list of various company names and associated info just in a long list one after another. I need to sort them alphabetically by name... The text document looks like this: Company Name: the_first_company's_name_here Address:... (2 Replies)
Discussion started by: quee1763
2 Replies

7. Shell Programming and Scripting

Capturing multi-line records containing known value?

Some records in a file look like this, with any number of lines between start and end flags: /Start Some stuff Banana 1 Some more stuff End/ /Start Some stuff End/ /Start Some stuff Some more stuff Banana 2 End/ ...how would I process this file to find records containing the... (8 Replies)
Discussion started by: cs03dmj
8 Replies

8. Infrastructure Monitoring

Processing records as group - awk

I have a file has following records policy glb id 1233 name Permit ping from "One" to "Second" "Address1" "Any" "ICMP-ANY" permit policy id 999251 service "snmp-udp" exit policy glb id 1234 name Permit telnet from "One" to "Second" "Address2" "Any" "TCP-ANY" permit policy id 1234... (3 Replies)
Discussion started by: baskar
3 Replies

9. Shell Programming and Scripting

reading a file inside awk and processing line by line

Hi Sorry to multipost. I am opening the new thread because the earlier threads head was misleading to my current doubt. and i am stuck. list=`cat /u/Test/programs`; psg "ServTest" | awk -v listawk=$list '{ cmd_name=($5 ~ /^/)? $9:$8 for(pgmname in listawk) ... (6 Replies)
Discussion started by: Anteus
6 Replies

10. Shell Programming and Scripting

AWK Multi-Line Records Numbering Problem

I have a set of files of multi-line records with the records separated by a blank line. I needed to add a record number to the front of each line followed by a colon and did the following: awk 'BEGIN {FS = "\n"; RS = ""}{for (i=1; i<=NF; i++)print NR,":",$i}' ~/Desktop/data98-1-25.txt >... (3 Replies)
Discussion started by: RacerX
3 Replies

Featured Tech Videos