Print each two column together from a matrix

Viewed 40

I have a matrix:

$cat ifile.txt

2  3  4  5  10 0  2  2  0  1  0  0  0  1
0  3  4  6  2  0  2  0  0  0  0  1  2  3
0  0  0  2  3  0  3  0  3  1  2  3  1  0

Here it has total 14 columns e.g. A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 A6 B6 A7 B7. Each odd number columns correspond to A and even number columns correspond to B.

I would like to print all A in one column and all B in one column. So my desire file looks like:

$cat ofile.txt

2  3
0  3
0  0
4  5
4  6
0  2
10 0
2  0
3  0
2  0
0  0
0  3
....

It is possible for me to do manually in the following way, but I am looking for some more easy way to do it.

for c in 1 3 5 7 9 11 13;do
awk'{printf"%5s %5s",$c,$(c+1)} > A$c.txt
cat A1 A3 A5 A7 A9 A11 A13 > ofile.txt
1 Answers
$ cat tst.awk
{
    for ( i=1; i<=NF; i++ ) {
        a[NR,i] = $i
    }
}
END {
    for ( i=1; i<=NF; i+=2 ) {
        for (j=1; j<=NR; j++ ) {
            print a[j,i], a[j,i+1]
        }
    }
}

.

$ awk -f tst.awk file
2 3
0 3
0 0
4 5
4 6
0 2
10 0
2 0
3 0
2 2
2 0
3 0
0 1
0 0
3 1
0 0
0 1
2 3
0 1
2 3
1 0

If you want to generalize for more than 2 output columns:

$ cat tst.awk
BEGIN { n=(n ? n : 2) }
{
    for (i=1; i<=NF; i++) {
        a[NR,i] = $i
    }
}
END {
    for ( i=1; i<=NF; i+=n ) {
        for (j=1; j<=NR; j++) {
            for ( k=1; k<=n; k++ ) {
                printf "%s%s", a[j,i+k-1], (k<n ? OFS : ORS)
            }
        }
    }
}

.

$ awk -v n=2 -f tst.awk file
2 3
0 3
0 0
4 5
4 6
0 2
10 0
2 0
3 0
2 2
2 0
3 0
0 1
0 0
3 1
0 0
0 1
2 3
0 1
2 3
1 0

.

$ awk -v n=7 -f tst.awk file
2 3 4 5 10 0 2
0 3 4 6 2 0 2
0 0 0 2 3 0 3
2 0 1 0 0 0 1
0 0 0 0 1 2 3
0 3 1 2 3 1 0
Related