Sort String using awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Sort String using awk
# 8  
Old 03-12-2014
Tried both solutions but did not work. Not sure if I am missing anything.
just fyi I have very limited knowledge of awk/shell scripting so something may be obvious but I may still miss it.
Code:
$ cat sortme

Code:
function sortme(x,f,    j, k)
{
    for (j=1;j<f;j++)
        for (k=1;k<=f-j;k++)
            if (x[k] > x[k+1]) {
                t=x[k]
                x[k]=x[k+1]
                x[k+1]=t
            }
}

BEGIN {FS = ":" }

{
    pref=$1
    m = split(pref, srt_pref, ",")
    n = split(baseline, srt_baseline, ",")
    if (sortme(srt_pref, m) == sortme(srt_baseline, n)) svcstatus = "OK"
    else svcstatus = "NOT-OK"
    printf "%s %s %s %s\n", sname, pref, baseline, svcstatus
}

Code:
$ snamelist="AAAB,ABCddf,LMNS,PQR:VALUE1 AAB,ABSSf,LMNS,DFD:VALUE2 LMNS,ABCddf,PQR,AAAB:VALUE3"
$ for sname in $snamelist
> do
>     BASELINE="AAAB,ABCddf,LMNS,PQR"
>     echo  "$sname" | awk -v baseline="$BASELINE" -f sortme
> done
 AAAB,ABCddf,LMNS,PQR AAAB,ABCddf,LMNS,PQR OK
 AAB,ABSSf,LMNS,DFD AAAB,ABCddf,LMNS,PQR OK
 LMNS,ABCddf,PQR,AAAB AAAB,ABCddf,LMNS,PQR OK
$

Output is not the expected output. 1st line should be OK, 2nd line NOT-OK and 3rd line OK

I also tried bubble sort method but its erroring out and not able to understand the error.
Code:
$ snamelist="AAAB,ABCddf,LMNS,PQR:VALUE1 AAB,ABSSf,LMNS,DFD:VALUE2 LMNS,ABCddf,PQR,AAAB:VALUE3"
$ BASELINE="AAAB,ABCddf,LMNS,PQR"
$ printf "%s\n" $snamelist | 
> awk -F: -v baseline="$BASELINE" '
>   function arrsort(A, n,i,c){
>     n=length(A)
>     do {
>       c=""; 
>       for(i=1;i<n;i++) {
>         if(A[i]>A[i+1]) {
>           c=A[i]; A[i]=A[i+1]; A[i+1]=c
>         }
>       }
>     }
>     while(c!="")
>   }
> 
>   BEGIN{
>     split(baseline,B,/,/)
>     arrsort(B)
>   }
> 
>   {
>     split($1,F,/,/)
>     arrsort(F)
>     svcstatus="OK"
>     for(i in F) if(B[i]!=F[i]) svcstatus="NOT-OK"
>     printf "%s %s %s %s\n", $0, $1, baseline, svcstatus
>   }
> '
awk: Cannot read the value of  B. It is an array name.
 The source line number is 3.
$

If there is any other solution to find if both strings have same values, I am ok to use it as long as its in awk and I am be able to compare and print output as below
Code:
echo  "$sname" | awk -v baseline="$BASELINE" 'BEGIN { FS=":" }
{<DEFINE SORTME FUNCTION HERE>}
    { pref=$1 ; if (sortme(pref) == sortme(baseline)) { svcstatus = "OK" } else { svcstatus = "NOT-OK" }  ;
    printf "%-35s %-35s %-35s %-10s\n", sname, pref, baseline, svcstatus}'

Thanks for your responses.
# 9  
Old 03-12-2014
The problem is with n=length(A), apparently this does not work with every awk.. Try this instead:

Code:
snamelist="AAAB,ABCddf,LMNS,PQR:VALUE1 AAB,ABSSf,LMNS,DFD:VALUE2 LMNS,ABCddf,PQR,AAAB:VALUE3"
BASELINE="PQR,AAAB,ABCddf,LMNS"

printf "%s\n" $snamelist | 
awk -F: -v baseline="$BASELINE" '
  function arrsort(A,n,	i,c){
    do {
      c=""; 
      for(i=1;i<n;i++) {
        if(A[i]>A[i+1]) {
          c=A[i]; A[i]=A[i+1]; A[i+1]=c
        }
      }
    }
    while(c!="")
  }
  BEGIN{
    n=split(baseline,B,/,/)
    arrsort(B,n)
  }
  {
    n=split($1,F,/,/)
    arrsort(F,n)
    svcstatus="OK"
    for(i in F) if(B[i]!=F[i]) svcstatus="NOT-OK"
    printf "%s %s %s %s\n", $0, $1, baseline, svcstatus
  }
'

Otherwise what is your OS and version?
# 10  
Old 03-13-2014
Didnt notice that the sortme function was returning an array instead of a string...here is the correct version which returns a string instead of an array ...
Code:
$ cat sortme
function sortme(x, f,   s, j, k)
{
    for (j=1;j<f;j++)
        for (k=1;k<=f-j;k++)
            if (x[k] > x[k+1]) {
                t=x[k]
                x[k]=x[k+1]
                x[k+1]=t
            }
    for (i=1; i<=f; i++) s = sprintf("%s", i<f ? x[i] "," : x[i])
    return s
}

BEGIN {FS = ":" }

{
    pref=$1
    m = split(pref, srt_pref, ",")
    n = split(baseline, srt_baseline, ",")
    if ((p = sortme(srt_pref, m)) == (b = sortme(srt_baseline, n))) svcstatus = "OK"
    else svcstatus = "NOT-OK"
    printf "%s %s %s %s\n", sname, pref, baseline, svcstatus
}

Only this part needed tweaking while the other part doesnt change...
# 11  
Old 03-18-2014
Sorry Guys, I thought I replied to this post but looks like I did not hit submit.

My issue was resolved using bubble sort suggested by "Scrutinizer"

My OS is HP-UX itanium 11.31

Thanks to all of you for your valuable and timely help.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Sort only numbers within a string

Hi, I am having contents in a file like below, cat testfile rpool/swap rpool/swap14 rpool/swap2 rpool/swap3 I want to sort the above contents like, rpool/swap rpool/swap2 rpool/swap3 rpool/swap14 I have tried in this way, (7 Replies)
Discussion started by: Sumanthsv
7 Replies

2. Shell Programming and Scripting

how to sort lines in the string

Hi guys, I am trying to sort numbers in the string in descending order but for some reason sort fails. n129$ echo "81 240" | sort -r 81 240 n129$ I am not sure what am I doing wrong. Is there a 100% reliable way to make sure that sort will always work. I mean on SUNS and IBM machines. ... (4 Replies)
Discussion started by: aoussenko
4 Replies

3. Shell Programming and Scripting

Remove duplicate chars and sort string [SED]

Hi, INPUT: DCBADD OUTPUT: ABCD The SED script should alphabetically sort the chars in the string and remove the duplicate chars. (5 Replies)
Discussion started by: jds93
5 Replies

4. Shell Programming and Scripting

sed or awk command to replace a string pattern with another string based on position of this string

here is what i want to achieve... consider a file contains below contents. the file size is large about 60mb cat dump.sql INSERT INTO `table1` (`id`, `action`, `date`, `descrip`, `lastModified`) VALUES (1,'Change','2011-05-05 00:00:00','Account Updated','2012-02-10... (10 Replies)
Discussion started by: vivek d r
10 Replies

5. UNIX for Dummies Questions & Answers

List directories with given string, sort by creation date

It is for HP-Unix B.11.31. Requirement: 1. List the directories, which directories name has given particular string. Example: Directories with name "Build" 2. On the output of 1. list the directories by creation date as sort order. I tried with; find . -type d -name "Build*" ... (3 Replies)
Discussion started by: Siva SQL
3 Replies

6. Shell Programming and Scripting

awk: sort lines by count of a character or string in a line

I want to sort lines by how many times a string occurs in each line (the most times first). I know how to do this in two passes (add a count field in the first pass then sort on it in the second pass). However, can it be done more optimally with a single AWK command? My AWK has improved... (11 Replies)
Discussion started by: Michael Stora
11 Replies

7. Shell Programming and Scripting

Require help to sort string

Hi Folks, Currently am working with 10g db. I want to sort the below o/p. Current output: ============ SQL> select partition_name from user_tab_partitions where table_name='USER_AUDIT'; PARTITION_NAME ------------------------------ PARTMAX PART_AUDIT_NOV02 PART_AUDIT_NOV08... (4 Replies)
Discussion started by: sathik
4 Replies

8. Shell Programming and Scripting

Sort based on string lenght.

I'm not familiar with find. If i use find in a certain directory i want it to show based on hierarchy. find . type d fol1 fol1/subfol1 fol1/subfol1/subfol1 fol2 fol2/subfol2 i want it to show like this fol1/subfol1/subfol1 fol1/subfol1 fol1 fol2/subfol2 fol2 do i need to use... (5 Replies)
Discussion started by: ryandegreat25
5 Replies

9. Shell Programming and Scripting

sort entire line based on part of the string

hey gurus, my-build1-abc my-build10-abc my-build2-abc my-build22-abc my-build3-abc basically i want to numerically sort the entire lines based on the build number. I dont zero pad the numbers because thats "how it is" ;-) sort -n won't work because it starts from the beginning. ... (10 Replies)
Discussion started by: gurpal2000
10 Replies

10. Shell Programming and Scripting

How to sort a string with numbers

Hi, I need help to sort a file contents. I am using sort -r option to basically reverse the comparison in descending order. However, i found out that my file is not sorted according, can anyone please help. My data is something like:- Hello world 20.982342864 343 19.234355545 222... (5 Replies)
Discussion started by: ahjiefreak
5 Replies
Login or Register to Ask a Question