matrix - 使用 awk 从 xyz 到矩阵

标签 matrix awk

我有一个问题,我设法通过变通办法解决了,所以我在这里希望向您学习更优雅的解决方案;-)

我必须解析程序的输出:它会像这样写入一个包含三列 x y z 的文件

1 1 11  
1 2 12  
1 3 13  
1 4 14  
2 1 21  
2 2 22  
2 3 23  
2 4 24  
3 1 31  
3 2 32  
3 3 33  
3 4 34  
4 1 41  
4 2 42  
4 3 43  
4 4 44  

在这样的矩阵中

11 12 13 14  
21 22 23 24  
31 32 33 34  
41 42 43 44  

我用这样的两行bash脚本解决了

dim_matrix=$(awk 'END{print sqrt(NR)}' file_xyz) #since I know that the matrix has to be squared and there are no blank lines in the file_xyz  
awk '{printf("%s%s",$3, !(NR%'${dim_matrix}'==0) ? OFS :ORS ) }' file_xyz  

您能否建议我一种仅使用 awk 执行相同操作的方法?

最佳答案

awk 并不处理真正的多维数组,但您可以使用正确构造的字符串来伪造它:

awk '
  {mx[$1 "," $2] = $3}
  END {
    size=sqrt(NR)
    for (x=1; x<=size; x++) {
      for (y=1; y<=size; y++)
          printf("%s ",mx[x "," y])
      print ""
    }
  }
' filename

您可以通过一次 awk 调用和对 wc 的调用来完成示例

awk -v "nlines=$(wc -l < filename)" '
  BEGIN {size = sqrt(nlines)}
  {printf("%s%s", $3, (NR % size == 0 ? ORS : OFS))
}' filename

关于matrix - 使用 awk 从 xyz 到矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7906095/

相关文章:

regex - 使用 grep 或其他方式匹配数字 1 而不是 10 或 11

python - 添加多个矩阵而不构建新矩阵

c++ - OpenCV 快速垫元素​​和邻居访问

python - 矩阵运算后得到输出

R:向量乘法矩阵

linux - 如何使用 awk、sed 等 Linux 命令删除文本 block 中双引号之间的所有空格

c - 矩阵、指针、C*

linux - 如何执行在匹配模式的每一行都有多个参数的命令

linux - 将变量添加到 CSV 文件中的列

python - 匹配 2 个文件中的字符串,如果匹配则返回文件 2 中上面的行