以矩阵形式放置数据

时间:2016-09-20 08:57:34

标签: bash

我无法想出一种在bash shell中执行此操作的方法,并准备在C中执行此操作。但也许你们有一个聪明的伎俩...我有两列X / Y位置和一列数据,我希望只保留矩阵形式的数据。

示例:

0 0 A
1 0 B
2 0 C
0 1 D
1 1 E
2 1 F
0 2 G
1 2 H
2 2 I
0 3 J
1 3 K
2 3 L

应该成为:

A B C
D E F
G H I
J K L

(或换位,我不在乎)。 我不知道此操作的名称,但基本上,当第二列更改值时,应该有一个新行。

3 个答案:

答案 0 :(得分:1)

一位cutpr

$ cut -d ' '  -f 3 test|pr -3 -a -t -s' '
A B C
D E F
G H I
J K L
    带有cut分隔符的
  • ' '仅打印第3列。
  • pr -3列,-a跨越而非向下,-t抑制页眉和页脚,' '分隔符

答案 1 :(得分:0)

以下是使用awk的一种方法:

compile ":mail:1.0.7"

答案 2 :(得分:0)

假设您的格式为"行列值"并概括你的 对随机数据流的问题,其中行和列 职位没有按特定顺序到达,您可以尝试这个脚本

#!/bin/bash

declare -A values  # parameter "values" is an "A"rray
rmax=0 cmax=0      # initial count of rows and columns

# read from standard input 3 values per line
while read r c v ; do
    # store the value just readen
    values[$c,$r]=$v
    # possibly update the final number of rows and columns
    [ $r -gt $rmax ] && rmax=$r
    [ $c -gt $cmax ] && cmax=$c
done

# double do loop on rows and columns, swap cycles if you prefer the transpose
for r in `seq 0 $rmax` ; do
    for c in `seq 0 $cmax` ; do
    # array parameters are undefined if not assigned,
    # it is possible to assign a def value using the ":-" syntax
    # in parameter substitution
        printf "%5s" ${values[$c,$r]:-"----"}
    done
    printf "\n"
done

如果您不喜欢破折号,只需使用printf "%5s" ${values[$c,$r]}

即可

使用示例

$ echo '0 2 e
3 1 f
1 0 g' | ./the_script
 ---- ----    e
    g ---- ----
 ---- ---- ----
 ----    f ----
$