Reversing numbers in a datafile of rows and columns


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Reversing numbers in a datafile of rows and columns
# 1  
Old 04-08-2009
Reversing numbers in a datafile of rows and columns

Hello,

I've tried searching the forum for an answer to my question, but without any luck...

I have a datafile looking simplified as follows:
01 02 03 04 05 06
07 08 09 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24

I want to reverse it by rearranging all the numbers from last to first, so that it looks like this:
24 23 22 21 20 19
18 17 16 15 14 13
12 11 10 09 08 07
06 05 04 03 02 01

I've tried using tac:
Code:
> tac --separator=" " filename
24
23 22 21 20 18
19 17 16 15 14 12
13 11 10 09 08 06
07 05 04 03 02 01

This does not give me the result I want. Can anyone explain why?

Maybe I should use sed or awk, or something else? Can anyone help me with this one?
# 2  
Old 04-08-2009
nawk -f invert.awk myFile

invert.awk:
Code:
{
  for(i=1; i<=NF;i++)
    arr[FNR,i]=$i
  nf=NF
  fnr=FNR
}
END {
  for(i=fnr; i;i--)
    for(j=nf; j;j--)
      printf("%s%c", arr[i,j], (j==1)?ORS:OFS)
}

# 3  
Old 04-08-2009
Code:
# tac file | while read line;do echo $line|tr " " "\n"|sort -rn|tr "\n" " ";echo; done
24 23 22 21 20 19
18 17 16 15 14 13
12 11 10 09 08 07
06 05 04 03 02 01

# 4  
Old 04-08-2009
Hi.

The original tac reverses tokens separated by spaces. The last token on each line is "number-followed-by-newline". When the tokens are reversed, the last token is "24-newline", and so on.

The solutions posted are fine. Here is a compact perl solution:
Code:
#!/usr/bin/env bash

# @(#) s1       Demonstrate reversal of symbols on lines (perl).

echo
set +o nounset
LC_ALL=C ; LANG=C ; export LC_ALL LANG
echo "Environment: LC_ALL = $LC_ALL, LANG = $LANG"
echo "(Versions displayed with local utility \"version\")"
version >/dev/null 2>&1 && version "=o" $(_eat $0 $1) tac perl
set -o nounset
echo

FILE=${1-data1}

echo " Data file $FILE:"
cat $FILE

echo
echo " Original results (trailing newline added):"
tac --separator=" " $FILE
echo

echo
echo " Re-written results:"
tac $FILE |
perl -n -e 'chomp;print join(" ",reverse(split(/ /))),"\n";'

exit 0

producing:
Code:
% ./s1

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 2.6.11-x1, i686
Distribution        : Xandros Desktop 3.0.3 Business
GNU bash 2.05b.0
tac (coreutils) 5.2.1
perl 5.8.4

 Data file data1:
01 02 03 04 05 06
07 08 09 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24

 Original results (trailing newline added):
24
23 22 21 20 18
19 17 16 15 14 12
13 11 10 09 08 06
07 05 04 03 02 01

 Re-written results:
24 23 22 21 20 19
18 17 16 15 14 13
12 11 10 09 08 07
06 05 04 03 02 01

The heart of the operation: after the lines are reversed by tac, process them with a perl script. The easy-to-read-but-not-so-easy-to-understand perl code stacks a number of functions: split the line into an array of tokens, reverse the content of the array (and thus the tokens), join the array with a space as separator into a string, print the string with a newline at the end. The "-n" says to do that series of operations for each line ... cheers, drl
# 5  
Old 04-14-2009
Quote:
Originally Posted by vgersh99
nawk -f invert.awk myFile

invert.awk:
Code:
{
  for(i=1; i<=NF;i++)
    arr[FNR,i]=$i
  nf=NF
  fnr=FNR
}
END {
  for(i=fnr; i;i--)
    for(j=nf; j;j--)
      printf("%s%c", arr[i,j], (j==1)?ORS:OFS)
}

This code does exactly the job I was looking for. Thanks a lot!
But I noticed a little problem when I tried it on one of my datafiles.

The datafile looks simplified as:
01 02 03 04 05 06
07 08 09 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33

When I used the code, it produced:
33 32 31
27 26 25
21 20 19
15 14 13
09 08 07
03 02 01

I want it to produce:
33 32 31 30 29 28
27 26 25 24 23 22
21 20 19 18 17 16
15 14 13 12 11 10
09 08 07 06 05 04
03 02 01

Is there an easy way around this problem by modifying this code?
# 6  
Old 04-14-2009
Quote:
Originally Posted by ghostdog74
Code:
# tac file | while read line;do echo $line|tr " " "\n"|sort -rn|tr "\n" " ";echo; done
24 23 22 21 20 19
18 17 16 15 14 13
12 11 10 09 08 07
06 05 04 03 02 01

Hi,

# tac file | awk '{print $6,$5,$4,$3,$2,$1}'

Any loopholes in the above command?
Hope this suites this situation. Smilie
# 7  
Old 04-14-2009
Quote:
Originally Posted by reddybs
Hi,

# tac file | awk '{print $6,$5,$4,$3,$2,$1}'

Any loopholes in the above command?
Hope this suites this situation. Smilie
should be alright if the file has exactly six fields. If the fields are variable, then might not be suitable.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Summing up values of rows of numbers

data file contains failed=24 error=23 error=163 failed=36 error=903 i need to get a total count of each value above. i'm looking for the most efficient method to do this as the datafile i provided is just a sample. the actual data can be several hundred thousands of lines. so from... (3 Replies)
Discussion started by: SkySmart
3 Replies

2. Shell Programming and Scripting

Compare 2 csv files by columns, then extract certain columns of matcing rows

Hi all, I'm pretty much a newbie to UNIX. I would appreciate any help with UNIX coding on comparing two large csv files (greater than 10 GB in size), and output a file with matching columns. I want to compare file1 and file2 by 'id' and 'chain' columns, then extract exact matching rows'... (5 Replies)
Discussion started by: bkane3
5 Replies

3. Shell Programming and Scripting

Adding (as in arithmetic) to numbers in columns in file, and writing new file with new numbers

Hi again. Sorry for all the questions — I've tried to do all this myself but I'm just not good enough yet, and the help I've received so far from bartus11 has been absolutely invaluable. Hopefully this will be the last bit of file manipulation I need to do. I have a file which is formatted as... (4 Replies)
Discussion started by: crunchgargoyle
4 Replies

4. Shell Programming and Scripting

Evaluate 2 columns, add sum IF two columns match on two rows

Hi all, I know this sounds suspiciously like a homework course; but, it is not. My goal is to take a file, and match my "ID" column to the "Date" column, if those conditions are true, add the total number of minutes worked and place it in this file, while not printing the original rows that I... (6 Replies)
Discussion started by: mtucker6784
6 Replies

5. Shell Programming and Scripting

Read in numbers from a datafile

Hi, I want to be able to read numbers from many files which have the same general form as follows: C3H8 4.032258004031807E-002 Phi = 1.000000E+00 Tau = 5.749E+00 sL0 = 3.805542E+01 dL0 = 1.514926E-02 Tb = 2.328291E+03 Tu = 3.450E+02 Alpha = ... (3 Replies)
Discussion started by: lost.identity
3 Replies

6. Shell Programming and Scripting

Deleting all the fields(columns) from a .csv file if all rows in that columns are blanks

Hi Friends, I have come across some files where some of the columns don not have data. Key, Data1,Data2,Data3,Data4,Data5 A,5,6,,10,, A,3,4,,3,, B,1,,4,5,, B,2,,3,4,, If we see the above data on Data5 column do not have any row got filled. So remove only that column(Here Data5) and... (4 Replies)
Discussion started by: ks_reddy
4 Replies

7. Shell Programming and Scripting

sorting the datafile in an order given in second datafile

Hi, I have two files: first input file is having 7-8 columns, and second data file is like I want to arrange my datafile1 in the order given in second data file, by comparing the seconddatafile with the second column of first file and print the entire line....also if any... (2 Replies)
Discussion started by: CAch
2 Replies

8. UNIX for Dummies Questions & Answers

Insert text in datafile with uneven columns

Dear Unix Gurus, I have a dataset consisting of a number of uneven columns. What I would like to do is fill up the missing rows with an arbitrary text of fixed value so that all columns now have an equal number of rows. for example, in the sample datafile below... 1.0 1.3 0.25 2.2 2.0... (2 Replies)
Discussion started by: tintin72
2 Replies

9. Shell Programming and Scripting

reversing the rows and coloumns ina given matrix?

hi plz can any body giv ethe code to perform transpose matrix of agiven matrix in shell scripts program????? (1 Reply)
Discussion started by: chaitunanduri
1 Replies

10. Shell Programming and Scripting

Combine a datafile with Master datafile, emergent!

Hi guys, my supervisor has asked me to solve the problem in 7 days, I've taken 3 days to think about it but couldn't figure out any idea. Please give me some thoughts with the following problem, I have index.database that has only index date: 1994 1995 1996 1997 1998 1999 I have... (6 Replies)
Discussion started by: onthetopo
6 Replies
Login or Register to Ask a Question