我有一系列的文件0000.vx.dat,0000.vy.dat,0000.vz.dat;...;0077.vx.dat,0077.vy.dat,0077.vz.dat...每个文件都是一个空格分隔的2D矩阵。我想把每个三元组的文件合并成一个基于坐标的数据格式,即:
时间步长+1 j vy(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变量格式中,前面有一个$!这只是原始脚本的一小段,但我猜这将被认为是它的核心!
可以说,这将需要大约六个月的时间,因为bash中的所有内存开销都与O(MxN)算法、子外壳和管道等相关。我最多在一天的时间里寻找更多。每个文件的大小约为18MB,因此应该不会有太大问题。我很乐意在awk中一次执行一个timestep,前提是每个timestep都有一个输出文件。我想,我可以把它们都放在一起,没有太多的后遗症。但是,重要的是,时间步长编号必须是坐标列表中的第一项。我可以通过一个带有-v例程的awk 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,谢谢你建议我把想要的输入和输出放得更清楚!
发布于 2013-01-29 06:15:18
就我个人而言,我使用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
https://stackoverflow.com/questions/14567665
复制