Bash:将输出管道输出到表格中

时间:2015-03-28 07:51:02

标签: 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

我尝试搜索,并遇到了命令,但我没弄明白。

谢谢

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:0)

您可以通过简短的bash脚本和一个小数组索引来获得您所期望的完全符合:

#!/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