2015-03-28 3 views
2

У меня есть программа, которая выводит следующее:Bash: выходная труба в таблицу

bash-3.2$ ./drawgrid 
0 
1 1 0 
1 1 0 
0 0 0 
1 
0 1 1 
0 1 1 
0 0 0 
2 
0 0 0 
1 1 0 
1 1 0 
3 
0 0 0 
0 1 1 
0 1 1 

Можно перенаправить вывод этой команды таким образом, что я получаю все матрицы 3x3 (вместе с их номером) отображается на столе, например, 2x2, как это?

0  1 
1 1 0 0 1 1 
1 1 0 0 1 1 
0 0 0 0 0 0 
2  3 
0 0 0 0 0 0 
1 1 0 0 1 1 
1 1 0 0 1 1 

Я пытался искать, и наткнулся на колонке команды, но я не понять это.

Спасибо

ответ

1

Вы можете использовать pr -2T, чтобы получить следующий вывод, что близко к тому, что вы ожидали:

0         2 
1 1 0        0 0 0 
1 1 0        1 1 0 
0 0 0        1 1 0 
1         3 
0 1 1        0 0 0 
0 1 1        0 1 1 
0 0 0        0 1 1 
1

Вы можете использовать сценарий AWK:

NF == 1 { 
    if ($NF % 2 == 0) { 
     delete line 
     line[1]=$1 
     f=1 
    } else { 
     print line[1]"\t"$1 
     f=0 
    } 
    n=1 
} 
NF > 1 { 
    n++ 
    if (f) 
     line[n]=$0 
    else 
     print line[n]"\t"$0 
} 

И трубы к нему:

$ ./drawgrid | awk -f 2x2.awk 
0  1 
1 1 0 0 1 1 
1 1 0 0 1 1 
0 0 0 0 0 0 
2  3 
0 0 0 0 0 0 
1 1 0 0 1 1 
1 1 0 0 1 1 
0

Вы можете получить именно то, что вы ожидаете с коротким скриптом Баш и немного индекса массива мысли:

#!/bin/bash 

declare -a idx 
declare -a acont 
declare -i cnt=0 
declare -i offset=0 

while IFS=$'\n'; read -r line ; do 

    [ ${#line} -eq 1 ] && { idx+=($line); ((cnt++)); } 
    [ ${#line} -gt 1 ] && { acont+=($line);((cnt++)); } 

done 

for ((i = 0; i < ${#idx[@]}; i+=2)); do 

    printf "%4s%8s\n" ${idx[i]} ${idx[i+1]} 
    for ((j = offset; j < offset + 3; j++)); do 
     printf " %8s%8s\n" ${acont[j]} ${acont[j+3]} 
    done 
    offset=$((j + 3)) 

сделано

выход 0

Выход

$ bash array_cols.sh <dat/cols.txt 
    0  1 
    1 1 0 0 1 1 
    1 1 0 0 1 1 
    0 0 0 0 0 0 
    2  3 
    0 0 0 0 0 0 
    1 1 0 0 1 1 
    1 1 0 0 1 1 
Смежные вопросы