Sorting within a record using AWK


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Sorting within a record using AWK
# 1  
Old 09-22-2011
Sorting within a record using AWK

Hello,
I have a file which has the following format: I have to do is sort individual records in the file based on the 4th field. Each record starts with "Module". Is there an easy way to do this using awk. I have tried piping output from awk to sort and also using "sort" inside awk but what happens is that the sorting happens for the entire file and the record-wise structure is compromised. Any suggestion is welcome.

Code:
Module :rtlc_BusSelWrap_rtl_copy_121_2_1_12 (rtlc_BusSelWrap_rtl_copy_121_2_1_12)
 M_RTL_MULT_UNS_12_2          1          0         NA
   M_RTL_RSHIFT_2_14          1          0         NA
Module :rtlc_AIMux_rtl_copy_189_4_144_18 (rtlc_AIMux_rtl_copy_189_4_144_18)
         M_RTL_EQ_32          8          8          0
             RTL_AND         28         18    55.5556
       M_RTL_DEC_4_2          2          2          0
             RTL_NOT         13          3    333.333
      M_RTL_PRIM_MUX        152       1044   -85.4406
          M_RTL_EQ_4          2          2          0
         M_RTL_NEQ_4          2          2          0
   M_RTL_RSHIFT_4_32          3          0         NA

The expected output is as follows:
Code:
Module :rtlc_BusSelWrap_rtl_copy_121_2_1_12 (rtlc_BusSelWrap_rtl_copy_121_2_1_12)
 M_RTL_MULT_UNS_12_2          1          0         NA
   M_RTL_RSHIFT_2_14          1          0         NA
Module :rtlc_AIMux_rtl_copy_189_4_144_18 (rtlc_AIMux_rtl_copy_189_4_144_18)
      M_RTL_PRIM_MUX        152       1044   -85.4406
         M_RTL_EQ_32          8          8          0
       M_RTL_DEC_4_2          2          2          0
          M_RTL_EQ_4          2          2          0
         M_RTL_NEQ_4          2          2          0
             RTL_NOT         13          3    333.333
              RTL_AND         28         18    55.5556
    M_RTL_RSHIFT_4_32          3          0         NA

# 2  
Old 09-22-2011
Which awk version (which operating system)?
# 3  
Old 09-22-2011
Hello,
latest awk/gawk will serve the purpose and OS is Fedora Linux
# 4  
Old 09-22-2011
Code:
awk '{
  if (/^Module :/) {
    close("sort -k4,4n")
    print
  } else print |"sort -k4,4n";
}
END { close("sort -k4,4n") } # not necessary
' infile

This will put the "NA"s together with the 0s, not the last.
This User Gave Thanks to binlib For This Post:
# 5  
Old 09-22-2011
The code requires the latest awk (awk 4, you can get it here):

Code:
awk 'END {
   print k; for (R in r) print r[R]
  }
/^Module/ {
  if (k) {
  print k; delete r[x]
  for (R in r) print r[R]
  }
  k = $0; delete r; next    
  }
{ 
  r[$NF ~ /NA/ ? 99999999 : $NF, NR] = $0
  }
BEGIN {  
  PROCINFO["sorted_in"] = "@ind_num_asc"
  }' infile

For example:

Code:
zsh-4.3.12[t]% cat infile 
Module :rtlc_BusSelWrap_rtl_copy_121_2_1_12 (rtlc_BusSelWrap_rtl_copy_121_2_1_12)
 M_RTL_MULT_UNS_12_2          1          0         NA
   M_RTL_RSHIFT_2_14          1          0         NA
Module :rtlc_AIMux_rtl_copy_189_4_144_18 (rtlc_AIMux_rtl_copy_189_4_144_18)
         M_RTL_EQ_32          8          8          0
             RTL_AND         28         18    55.5556
       M_RTL_DEC_4_2          2          2          0
             RTL_NOT         13          3    333.333
      M_RTL_PRIM_MUX        152       1044   -85.4406
          M_RTL_EQ_4          2          2          0
         M_RTL_NEQ_4          2          2          0
   M_RTL_RSHIFT_4_32          3          0         NA

Code:
zsh-4.3.12[t]% awk 'END {
   print k
for (R in r) print r[R]
  }
/^Module/ {
  if (k) {
  print k; delete r[x]
  for (R in r) print r[R]
  }
  k = $0; delete r; next
  }
{
  r[$NF ~ /NA/ ? 99999999 : $NF, NR] = $0
  }
BEGIN {
  PROCINFO["sorted_in"] = "@ind_num_asc"
  }' infile 
Module :rtlc_BusSelWrap_rtl_copy_121_2_1_12 (rtlc_BusSelWrap_rtl_copy_121_2_1_12)
 M_RTL_MULT_UNS_12_2          1          0         NA
   M_RTL_RSHIFT_2_14          1          0         NA
Module :rtlc_AIMux_rtl_copy_189_4_144_18 (rtlc_AIMux_rtl_copy_189_4_144_18)
      M_RTL_PRIM_MUX        152       1044   -85.4406
          M_RTL_EQ_4          2          2          0
         M_RTL_NEQ_4          2          2          0
         M_RTL_EQ_32          8          8          0
       M_RTL_DEC_4_2          2          2          0
             RTL_AND         28         18    55.5556
             RTL_NOT         13          3    333.333
   M_RTL_RSHIFT_4_32          3          0         NA

This User Gave Thanks to radoulov For This Post:
# 6  
Old 09-22-2011
MySQL Thank you so much. This is exactly what I wanted.

If NA and 0 are mixed then there is no problem in interpretation. Thanks again.
# 7  
Old 09-22-2011
Hi,

Using 'Perl':
Code:
$ cat infile
Module :rtlc_BusSelWrap_rtl_copy_121_2_1_12 (rtlc_BusSelWrap_rtl_copy_121_2_1_12)
 M_RTL_MULT_UNS_12_2          1          0         NA
   M_RTL_RSHIFT_2_14          1          0         NA
Module :rtlc_AIMux_rtl_copy_189_4_144_18 (rtlc_AIMux_rtl_copy_189_4_144_18)
         M_RTL_EQ_32          8          8          0
             RTL_AND         28         18    55.5556
       M_RTL_DEC_4_2          2          2          0
             RTL_NOT         13          3    333.333
      M_RTL_PRIM_MUX        152       1044   -85.4406
          M_RTL_EQ_4          2          2          0
         M_RTL_NEQ_4          2          2          0
   M_RTL_RSHIFT_4_32          3          0         NA
$ cat script.pl
use warnings;
use strict;

@ARGV == 1 or die qq[Usage: perl $0 input-file\n];

my (@nas, @nums);

while ( <> ) {
        chomp;
        if ( ( my $begin = /\A(?i:module)\s*:/ ) ... ( my $end = /\A(?i:module)\s*:/ ) ) {
                if ( $begin ) {
                        printf "%s\n", $_;
                        next;
                }

                if ( ! $end ) {
                        my @f = split;
                        if ( uc $f[ $#f ] eq qq[NA] ) {
                                push @nas, $_;
                        }
                        else {
                                push @nums, $_;
                        }
                        next;
                }

                @nums = sort { (split( /\s+/, $a ))[4] <=> (split( /\s+/, $b ))[4] } @nums;
                printf qq[%s\n],
                        join qq[\n], @nums, @nas;
                @nas = ();

                redo;
        }
} continue {
        if ( eof() ) {
                @nums = sort { (split( /\s+/, $a ))[4] <=> (split( /\s+/, $b ))[4] } @nums;
                printf qq[%s\n],
                        join qq[\n], @nums, @nas;
                @nas = ();

        }
}
$ perl script.pl infile
Module :rtlc_BusSelWrap_rtl_copy_121_2_1_12 (rtlc_BusSelWrap_rtl_copy_121_2_1_12)
 M_RTL_MULT_UNS_12_2          1          0         NA
   M_RTL_RSHIFT_2_14          1          0         NA
Module :rtlc_AIMux_rtl_copy_189_4_144_18 (rtlc_AIMux_rtl_copy_189_4_144_18)
      M_RTL_PRIM_MUX        152       1044   -85.4406
         M_RTL_EQ_32          8          8          0
       M_RTL_DEC_4_2          2          2          0
          M_RTL_EQ_4          2          2          0
         M_RTL_NEQ_4          2          2          0
             RTL_AND         28         18    55.5556
             RTL_NOT         13          3    333.333
   M_RTL_RSHIFT_4_32          3          0         NA

Regards,
Birei
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Sorting group of records and loading last record

Hi Everyone, I have below record set. File is fixed widht file 101newjersyus 20150110 101nboston us 20150103 102boston us 20140106 102boston us 20140103 I need to group record based on first 3 letters in our case(101 and 102) and sort last 8 digit in ascending order and print only... (4 Replies)
Discussion started by: patricjemmy6
4 Replies

2. Shell Programming and Scripting

Require original field position after sorting the values in a record

Dear Team, Can any body help me out to get the filed position of the records post sorting using AWK programming. Thanks in advance Example Input: StudentID col-1 col-2 col-3 col-4 1234 14 10 12 13 1235 10 11 12 13 1236 13 12 11 10 ... (3 Replies)
Discussion started by: Srinivasa Reddy
3 Replies

3. Shell Programming and Scripting

How to compare current record,with next and previous record in awk without using array?

Hi! all can any one tell me how to compare current record of column with next and previous record in awk without using array my case is like this input.txt 0 32 1 26 2 27 3 34 4 26 5 25 6 24 9 23 0 32 1 28 2 15 3 26 4 24 (7 Replies)
Discussion started by: Dona Clara
7 Replies

4. Shell Programming and Scripting

Help with awk sorting with different values

Hello, I have a file as follows: BTA Pos KLD 4 79.7011 5.7711028907 4 79.6231 5.7083918219 5 20.9112 4.5559494707 5 58.0002 3.4423546273 6 38.2569 4.7108176788 6 18.3889 7.3631759258 (1 Reply)
Discussion started by: Homa
1 Replies

5. Shell Programming and Scripting

Sorting record

Hi all, Can any one help whether we can able to sort a record with delimiter plz ? (3 Replies)
Discussion started by: thelakbe
3 Replies

6. Shell Programming and Scripting

Sorting inside awk

I have an array with five columns and i want to write it to a file. Before writing it i must sort it using the field in the fifth column. _________________________________________ |field 1|field 2|field 3|field 4|field 5| | | | | | | | | | |... (6 Replies)
Discussion started by: beatblaster666
6 Replies

7. Shell Programming and Scripting

Please help in sorting record

dn: uid=peter@exmaple.com,ou=example-com,ou=mail,dc=example,dc=to cn: Peter sn: Norton displayName: Peter Norton dn: uid=ras@exmaple.com,ou=example-com,ou=mail,dc=example,dc=to cn: Ras sn: Kam displayName: Ras Kam i have a text file with 300 entries with multiple ldap entries... (5 Replies)
Discussion started by: learnbash
5 Replies

8. Shell Programming and Scripting

AWK, sorting-if and print help.

Little-bit of awk experience, need some of the expert help on here. Browsed around here, got a little further, but I am still missing some pieces. Can you help me fill-in my missing awk cells? Sample data file (leaving out ","'s): Column 1 Column 2 Column 3 Column 4 ... (10 Replies)
Discussion started by: boolean2222
10 Replies

9. Shell Programming and Scripting

sorting in awk

i have following file have following type of data 1~%%~fcashfafh~%%~9797 can i sort(numeric) the file on first field and then on last feild using awk (3 Replies)
Discussion started by: mahabunta
3 Replies

10. Shell Programming and Scripting

awk sorting

Hi, I have used the following code to sort two sets of data: awk '{printf "%10s %s\n",$1,$2}' The first column is text and the second involves numbers. I was just wondering how i would go about sorting the second number so that they ascend from the top? Thanks for any help (4 Replies)
Discussion started by: Jaken
4 Replies
Login or Register to Ask a Question