help printing two consecutive columns, every twenty in a large matrix


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting help printing two consecutive columns, every twenty in a large matrix
# 1  
Old 03-15-2011
help printing two consecutive columns, every twenty in a large matrix

Hi,

I'm having a problem printing two consecutive columns, as I iterate through a large matrix by twenty columns and I was looking for a solution.

My input file looks something like this
Code:
1 id1 A1 A2 A3 A4 A5 A6....A20 A21 A22 A23....A4001 A4002
2 id2 B1 B2 B3 B4 B5 B6...
3 id3 ...
4 id4 ...


What I would like is the first two columns and then every two consecutive columns as I iterate through all columns by 20.

So if we just look at the first two lines the output would be:
Code:
1 id1 A19 A20 A39 A40 A59 A60... A4001 A4002
2 id2 B19 B20 B39 B40 B59 B60... B4001 B4002

The following works for one column:
Code:
awk '{for (i=1; i<=NF;i+=20) printf "%s ",$i; printf "\n"}' tst > tmp

So I thought I could create a j variable something like what I've tried below and include it in either like the following but I'm having trouble:
Code:
awk '{for (i=2; i<=NF;i+=20) {j=i-1} printf "%s ",$(ij); printf "\n"}' tst > tmp


Thanks in advance.

Last edited by Franklin52; 03-15-2011 at 07:21 AM.. Reason: Please use code tags
# 2  
Old 03-15-2011
Code:
echo {1..200} |awk '{for (i=19; i<=NF;i+=20) printf "%s %s ",$i,$(i+1);print ""}'
19 20 39 40 59 60 79 80 99 100 119 120 139 140 159 160 179 180 199 200

# 3  
Old 03-15-2011
Thanks for your reply. I've tried your example but I am still having problems. The files I would like to modify are more than 200 cols wide and vary extensively and when I try and use different file lengths I get unexpected results:
Code:
echo {1..400} |awk '{for (i=19;i<=NF;i+=20) printf "%s %s ",$i,$(i+i);printf ""}'
19 38 39 78 59 118 79 158 99 198 119 238 139 278 159 318 179 358 199 398 219  239  259  279  299  319  339  359  379  399

Also I always want the first two columns and I thought I'd modify your example so i=1 and the columns seem to bounce around a lot:
Code:
echo {1..200} | awk '{for(i=1;i<=NF;i+=20) printf "%s %s ",$i,$(i+i);printf ""}'
1 2 21 42 41 82 61 122 81 162 101  121  141  161  181

Any idea why this might be occurring?

Thanks!

Last edited by Scott; 03-15-2011 at 01:10 PM.. Reason: Code tags, please...
# 4  
Old 03-15-2011
Something like that?

Last edited by danmero; 03-15-2011 at 12:58 PM.. Reason: Useless idea
# 5  
Old 03-15-2011
Are your columns of a fixed width? Is there a delimiter (other than spaces) between them? Have you considered using cut rather than awk?

Andrew
# 6  
Old 03-15-2011
Here is a slice of one of the data files.
Code:
I Name 146125883 146125883 146125889 146125889 146125926 146125926
M 10080_COIII B B B B B B
M GGaluGA000006 A A A B A A
M GGaluGA000013 A A A B A B

So the cols are not really fixed width, there is no other delimiter other than a space. Not sure how cut would work if I want every 20th and 21st entry? Is there a way

@danmero, considering I have to read in a file to set i <=NF. I'm not sure how different your logic is to the original post other than the modification to print the first two columns? I guess I could also do it like:
Code:

Code:
awk '{printf "%s %s ", $1 $2}; {for (i=19; i<=NF; i+=20) printf "%s %s ", $i,$(i+1);printf "\n"}' tst > tmp


The problem seems to be in the for loop, as different file lengths seem to return weird results, when for example the length of NF is different to 200?



Last edited by Scott; 03-15-2011 at 01:11 PM.. Reason: Code tags, please...
# 7  
Old 03-15-2011
Quote:
Originally Posted by flotsam
What I would like is the first two columns and then every two consecutive columns as I iterate through all columns by 20.
Let's start over from this statement.
Code:
# awk '{for(i=1;i<=NF;i+=20){printf "%s %s ", $i, $(i+1)};print ""}' file

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Parsing a subset of data from a large matrix

I do have a large matrix of the following format and it is tab delimited ch-ab1-20 ch-bb2-23 ch-ab1-34 ch-ab1-24 er-cc1-45 bv-cc1-78 ch-ab1-20 0 2 3 4 5 6 ch-bb2-23 3 0 5 ... (6 Replies)
Discussion started by: Kanja
6 Replies

2. Shell Programming and Scripting

Transform columns to matrix

The following code transform the matrix to columns. Is it possible to do it other way around ( get the input from the output) ? input y1 y2 y3 y4 y5 x1 0.3 0.5 2.3 3.1 5.1 x2 1.2 4.1 3.5 1.7 1.2 x3 3.1 2.1 1.0 4.1 2.1 x4 5.0 4.0 6.0 7.0 1.1 output x1 y1 0.3 x2 y1 1.2 x3... (1 Reply)
Discussion started by: quincyjones
1 Replies

3. Shell Programming and Scripting

Maybe by AWK: printing help diagonal matrix characters into line

Hi Experts, I want to print this charts diagonal data into straight lines. This is a matrix 24X24 Horizontal and vertical. - I want to print all the diagonal cutting characters into straight line: Data: E F S S A H A L L A T M C N O T S O B O D U Q H I W I B N L O C N I L N L A N S I N... (9 Replies)
Discussion started by: rveri
9 Replies

4. Shell Programming and Scripting

Square matrix to columns

Hello all, I am quite new in this but I need some help to keep going with my analysis. I am struggling with a short script to read a square matrix and convert it in two collumns. A B C D A 0.00 0.06 0.51 0.03 B 0.06 0.00 0.72 0.48 C 0.51 0.72 0.00 ... (7 Replies)
Discussion started by: EvaAM
7 Replies

5. Programming

Converting columns to matrix

Dear All I would like to convert columns to matrix For example my data looks like this D2 0 D2 0 1.0 D2 0 D2 1 0.308 D2 0 D2 2 0.554 D2 0 D2 3 0.287 D2 0 D2 4 0.633 D2 0 D2 5 0.341 D2 0 D2 6 0.665 D2 0 D2 7 0.698 D2 0 D2 8 0.625 D2 0 D2 9 0.429 D2 0 D2 10 0.698 D2 0 D2 11... (7 Replies)
Discussion started by: bala06
7 Replies

6. Shell Programming and Scripting

conversion: 3 columns into matrix

Hi guys, here https://www.unix.com/shell-programming-scripting/193043-3-column-csv-correlation-matrix-awk-perl.html I found awk script converting awk '{ OFS = ";" if (t) { if (l != $1) t = t OFS $1 } else t = OFS $1 x = x ? x OFS $NF : $NF l = $1 }... (2 Replies)
Discussion started by: grincz
2 Replies

7. Shell Programming and Scripting

Columns comparision of two large size files and printing the difference

Hi Experts, My requirement is to compare the second field/column in two files, if the second column is same in both the files then compare the first field. If the first is not matching then print the first and second fields of both the files. first file (a .txt) < 1210018971FF0000,... (6 Replies)
Discussion started by: krao
6 Replies

8. Shell Programming and Scripting

grep/fgrep/egrep for a very large matrix

All, I have a problem with grep/fgrep/egrep. Basically I am building a 200 times 200 correlation matrix. The entries of this matrix need to be retrieved from another very large matrix (~100G). I tried to use the grep/fgrep/egrep to locate each entry and put them into one file. It looks very... (1 Reply)
Discussion started by: realwindfly
1 Replies

9. Shell Programming and Scripting

extracting multiple consecutive columns using awk

Hello, I have a matrix 200*10,000 and I need to extract the columns between 40 and 77. I dont want to write in awk all the columns. eg: awk '{print $40, $41, $42,$43 ... $77}'. I think should exist a better way to do this. (10 Replies)
Discussion started by: auratus42
10 Replies

10. Linux

Regarding Dot Matrix Printing

Hi all, What I want is that can we manage printing a text file on a Dot Matrix printer installed on a Linux machine and the printer should not take the normal A4 format, but should print only to the extent the text file has text in it. What happen usually is that when we give print comand to any... (0 Replies)
Discussion started by: aman_mlt
0 Replies
Login or Register to Ask a Question