Печатать каждый два столбца вместе из матрицы - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть матрица:

$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

Здесь всего 14 столбцов, например A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 A6 B6 A7 B7. Каждый столбец нечетного числа соответствует A, а столбец четного номера соответствует B.

Я хотел бы напечатать все A в одном столбце и все B в одном столбце. Итак, мой файл желаний выглядит так:

$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
....

Я могу сделать это вручную следующим образом, но я ищу более простой способ сделать это.

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 Ответ

3 голосов
/ 03 апреля 2020
$ 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

Если вы хотите обобщить более 2 выходных столбцов:

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...