Sort each row (horizontally) in AWK or any


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Sort each row (horizontally) in AWK or any
# 1  
Old 03-30-2012
Sort each row (horizontally) in AWK or any

Hello,

How to sort each row in a document with numerical values and with more than one row. Example

Input data (file1.txt):
4 6 8 1 7
2 12 9 6 10
6 1 14 5 7

and I want the the output to look like this(file2.txt):
1 4 6 7 8
2 6 9 10 12
1 5 6 7 14

I've tried
Code:
 sort -n file1.txt > file2.txt

also
Code:
 sort -k5n,5 file1.txt > file2.txt

and
Code:
awk '{split($0,a);asort(a);for(i=NF;i>0;i--){printf("%s ",a[i])}print ""}' file1.txt > file2.txt

but these don't work.

Thank you.
# 2  
Old 03-30-2012
You were close with the awk:

Code:
awk ' {split( $0, a, " " ); asort( a ); for( i = 1; i <= length(a); i++ ) printf( "%s ", a[i] ); printf( "\n" ); }' input >output

Some versions of awk have a buggy asort() function. Off the top of my head I don't remember the circumstanses, but for anything that counts I write my own sort function.
# 3  
Old 03-30-2012
Hello,

Thanks agama, but
this is the message I get after executing the code

Code:
awk: calling undefined function asort
 input record number 1, file test.txt
 source line number 1

# 4  
Old 03-30-2012
Then your awk is not gnu awk and thus doesn't have asort().

Try this:

Code:
awk '
        # sort v1 into ascending order
        function bubble( v1,            n, s, i, pass, swap )
        {
                swap = 1;
                pass = 0;

                while( swap )
                {
                        swap = 0;
                        pass++;
                        for( i = 0; i <  n - pass;  i++ )
                        {
                                if( v1[i] > v1[i+1] )
                                {
                                        swap++;
                                        s = v1[i];
                                        v1[i] = v1[i+1];
                                        v1[i+1] = s;
                                }
                        }

                }
        }

    {
        split( $0, a, " " );    
        bubble( a ); 
        for( i = 1; i <= length(a); i++ ) 
            printf( "%s ", a[i] ); printf( "\n" ); 
    }'  input >output



It uses a simple bubble sort -- not all that efficient, but it works.
# 5  
Old 03-30-2012
Code:
[root@node2 ~]# cat sort.sh 
while read line; do
      ary=(${line})
      for((i=0; i!=${#ary[@]}; ++i)); do
         for((j=i+1; j!=${#ary[@]}; ++j)); do
              if (( ary[i] > ary[j] )); then
                    ((key=ary[i]))
                    ((ary[i]=ary[j]))
                    ((ary[j]=key))
              fi
         done
      done
      echo ${ary[@]}
done < ${1}
[root@node2 ~]# cat data 
4 6 8 1 7
2 12 9 6 10
6 1 14 5 7
[root@node2 ~]# bash sort.sh data 
1 4 6 7 8
2 6 9 10 12
1 5 6 7 14

This User Gave Thanks to complex.invoke For This Post:
# 6  
Old 03-31-2012
For agama

I tried this
Code:
 awk -f code.awk file1.txt > file2.txt

and gave me this
Code:
awk: can't open file code.awk
 source line number 1 source file code.awk
 context is
	 >>>  <<<

I'm not an expert and I'll figure it out if I can, or any advice you can give me? I'll appreciate it. I'll try to install the GNU awk and make the previous code work.

thanks.

For huaihaizi3
Sorry, I'm not an expert and I currently don't know how to run that code you posted, I will definitely research and find out what you mean. I was basically looking for an awk code or a unix command that would do the job. That looks like C, I will work on your code to understand it better and see if I can make it work. I appreciate your help, any advice?
# 7  
Old 03-31-2012
From the looks of things you didn't name the file code.awk. If you run the command ls -al code.awk what do you get? The fact that awk says it cannot open the file means that the file isn't in the current directory.

As for running the other code... edit a file (we'll call it foo.sh just to have something specific) and paste the code into it. Then you can set the execute bit with chmod 755 foo.sh and can run it as a command by typing foo.sh xxx.txt on the command line.

You can do the same with the awk as long as you leave the leading awk ' and trailing close quote.
This User Gave Thanks to agama For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Sort by values in the 1st row, leaving first four coulumns untouched

Dear all, will be thankful if you can help on sort command. My data looks like (tab separated; number of columns 2317; N of rows ~200000): a b c d V10 V2 V8 V4 V7 xx z y 1000 1 2 0 2 0 tr v m 1001 0 0 1 2 2 rg s ... (7 Replies)
Discussion started by: kush
7 Replies

2. Shell Programming and Scripting

Sort two columns with alphanumeric values horizontally

Hi, I have a file like aa bb dmns|860 dmns|756 ee ff aa bb dmns|310 dmns|260 ee ff aa bb dmns|110 dmns|77 ee ff aa bb dmns|756 dmns|860 ee ff aa bb dmns|110 dmns|77 ee ff aa bb dmns|233 dmns|79 ee ff aa bb dmns|79 dmns|233 ee ff I want to sort the values in column3 and column4... (2 Replies)
Discussion started by: sammy777888
2 Replies

3. Shell Programming and Scripting

Sort by first row - awk

how can i sort the table based on first row? thanks in advance input name d b c a l l1 l2 l3 l4 l1 1 2 3 4 l2 2 2 2 1 l3 1 1 2 2ouput name a b c d l1 l4 ... (4 Replies)
Discussion started by: quincyjones
4 Replies

4. Shell Programming and Scripting

awk transpose column to row and sort

I am trying to awk the output from below output for each port: i need separate line with comma source file Output required (3 Replies)
Discussion started by: ranjancom2000
3 Replies

5. UNIX for Dummies Questions & Answers

Sorting arrays horizontally without END section, awk

input: ref001, Europe, Belgium, 1001 ref001, Europe, Spain, 203 ref001, Europe, Germany, 457 ref002, America, Canada, 234 ref002, America, US, 87 ref002, America, Alaska, 652 Without using an END section, I need to write all the info related to the same ref number ($1)and continent ($2) on... (9 Replies)
Discussion started by: lucasvs
9 Replies

6. Shell Programming and Scripting

Subtracting each row from the first row in a single column file using awk

Hi Friends, I have a single column data like below. 1 2 3 4 5 I need the output like below. 0 1 2 3 4 where each row (including first row) subtracting from first row and the result should print below like the way shown in output file. Thanks Sid (11 Replies)
Discussion started by: ks_reddy
11 Replies

7. Shell Programming and Scripting

Sort data from column to row

Hi, I need somebody's help with sorting data with awk. I've got a file: 10 aaa 4584 12 bbb 6138 20 ccc 4417 21 ddd 7796 10 eee 7484 12 fff ... (5 Replies)
Discussion started by: killerbee
5 Replies

8. Shell Programming and Scripting

Sort a file from specific row onwards

Hello All: I've file in below format. File name is "FIRSTN.TBL": AAAAAA N BBBBBBBBBBBBBBBBBBBBBBB N . . . . ZZZZZZZZZZZZZZZZZZZZZZZZZZ N My file row length is 40 characters and my second column will start from 25th column and it is only... (3 Replies)
Discussion started by: nvkuriseti
3 Replies

9. Shell Programming and Scripting

awk command : row by row merging of two files

I want to write a scrpit to merge files row wise (actually concatinating) main.txt X Y Z file 1 A B C file 2 1 2 3 now i want the script to check if the file1 is empty or not, if empty then make it like A B C 1 2 3 again to check if second file is empty if not do as done... (0 Replies)
Discussion started by: shashi792
0 Replies

10. Shell Programming and Scripting

sort and semi-duplicate row - keep latest only

I have a pipe delimited file. Key is field 2, date is field 5 (as example, my real file is more complicated of course, but the KEY and DATE are accurate) There can be duplicate rows for a key with different dates. I need to keep only rows with latest date in this case. Example data: ... (4 Replies)
Discussion started by: LisaS
4 Replies
Login or Register to Ask a Question