bash – 将一系列矩阵文件转换为awk中的坐标索引

我有一个时间序列的文件0000.vx.dat,0000.vy.dat,0000.vz.dat; …; 0077.vx.dat,0077.vy.dat,0077.vz.dat …每个文件都是以空格分隔的2D矩阵.我想把每个三元组文件组合成一个基于坐标的数据格式,即:

[时间步1] [i] [j] [vx(i,j)] [vy(i,j)] [vz(i,j)]

每个文件编号对应于特定的时间步长.鉴于我在这个时间序列中的数据量(~4 GB),bash没有削减它所以它似乎是时候转向awk …特别是mawk.在bash中尝试这个是非常愚蠢的,但现在是
我不幸的尝试:

for x in $(seq 1 78)
do
  tfx=${tf[$x]} # an array of padded zeros
  for y in $(seq 1 1568)
  do
    for z in $(seq 1 1344)
    do
      echo $x $y $z $(awk -v i=$z -v j=$y "FNR == i {print j}" $tfx.vx.dat) $(awk -v i=$z -v j=$y "FNR == i {print j}" $tfx.vy.dat) $(awk -v i=$z -v j=$y "FNR == i {print j}" $tfx.vz.dat) >> $file
    done
  done
done

编辑:谢谢你,ruakh,指出我保持j在shell变量格式中,前面是$!这只是原始剧本的片段,但我想这将被认为是它的胆量!

可以说这将花费大约六个月的时间,因为与O(MxN)算法,子壳和管道以及诸如此类的东西相关联的bash中的所有内存开销.我最多只想找一天.每个文件大约18 MB,所以它不应该是一个问题.如果我每次只得到一个输出文件,我会很高兴在awk中一次执行这一步.我想,我可以把它们全部放在一起,没有多少问题.但重要的是,时间步数是坐标列表上的第一项.我可以通过一个awk -v参数(参见上文)使用bash例程来实现这一点.我不知道如何在三个单独的文件中查找矩阵的特定元素,并将它们全部放在一个输出中.这是我想克服的主要障碍.我希望mawk可以在努力和计算速度之间提供一个很好的平衡.如果这对于一个awk脚本来说似乎太多了,我可以去更低级别的东西,并且会感谢任何回答让我知道我应该去C的人.

先感谢您!我真的很喜欢awk,但我担心我是新手.

三个文件0000.vx.dat,0000.vy.dat和0000.vz.dat将如下所示(除了巨大和正确的尺寸):

0000.vx.dat:

1 2 3
4 5 6
7 8 9

0000.vy.dat:

10 11 12
13 14 15
16 17 18

0000.vz.dat:

19 20 21
22 23 24
25 26 27

我希望能够输入:

awk -v t=1 -f stackoverflow.awk 0000.vx.dat 0000.vy.dat 0000.vz.dat

并获得以下输出:

1 1 1 1 10 19
1 1 2 2 11 20
1 1 3 3 12 21
1 2 1 4 13 22
1 2 2 5 14 23
1 2 3 6 15 24
1 3 1 7 16 25
1 3 2 8 17 26
1 3 3 9 18 27

编辑:谢谢你,shellter,建议我把所需的输入和输出更清楚!

最佳答案 就个人而言,我使用gawk来处理我的大部分文本文件.但是,由于您已经请求了mawk兼容解决方案,因此这是解决问题的一种方法.在您目前的工作目录中运行:

for i in *.vx.dat; do nawk -f script.awk "$i" "${i%%.*}.vy.dat" "${i%%.*}.vz.dat"; done

script.awk的内容:

FNR==1 {
    FILENAME++
    c=0
}

{
    for (i=1;i<=NF;i++) {
        c++
        a[c] = (a[c] ? a[c] : FILENAME FS NR FS i) FS $i
    }
}

END {
    for (j=1;j<=c;j++) {
        print a[j] > sprintf("%04d.dat", FILENAME)
    }
}

运行上述操作时,结果应该是包含坐标的每组三个文件的单个文件.这些输出文件的文件名格式为:timestamp 1“.dat”.为了方便起见,我决定用四个0填充这些文件名.但您可以将其更改为您喜欢的任何格式.这是我从你发布的样本数据中得到的结果. 0001.dat的内容:

1 1 1 1 10 19
1 1 2 2 11 20
1 1 3 3 12 21
1 2 1 4 13 22
1 2 2 5 14 23
1 2 3 6 15 24
1 3 1 7 16 25
1 3 2 8 17 26
1 3 3 9 18 27
点赞