【发布时间】:2015-04-17 08:28:58
【问题描述】:
我们有一个文件 - input.txt - 5 行 9 列的矩阵(实际文件是 10K+ 行和 40K+ 列):
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9
0.8 1 0.8 0.6 0.9 0.4 0.3 0.1 0.6
1 0.6 0.5 0.6 0.3 0.1 0.2 0.5 0.2
0.4 0.5 0.1 0.7 0.8 0.8 0.6 0.3 0.3
0.9 0.2 1 0.1 0.9 0.8 0.6 0.9 0.2
0.9 1 0.2 0.5 0.5 0.7 0.5 0.3 0.2
注意 1: 文件没有标题 - 将其保留在此处以供参考。
注意 2: 解决方案必须扩展到具有 40K+ 列的真实数据。注意 3: 添加了 python 和 perl 标签,以性能更好者为准。
需要将其转换为以下output.txt - 矩阵5rows 3cols:
Col1 Col2 Col3
2.6 1.7 1.3
1.6 0.5 0.9
0.7 2.4 0.9
2.2 2.5 1.3
1.4 1.9 0.7
逻辑:
Output_Col1 = (Input_Col2) + (Input_Col3*2)
Output_Col2 = (Input_Col5) + (Input_Col6*2)
Output_Col3 = (Input_Col8) + (Input_Col9*2)
努力,尝试将第二列和第三列的矩阵文件作为单独的文件,如果我可以将第二个文件乘以 2 然后将这两个文件相加...可能有更简单的方法。
ncol=9
cut -d" " -f`seq -s "," 2 3 $ncol` input.txt > col2s.txt
cut -d" " -f`seq -s "," 3 3 $ncol` input.txt > col3s.txt
【问题讨论】:
-
如果您的输入文件有 >40,000 列,那么您将遇到的最基本问题是您使用的工具是否可以读取那么大的一行(即一行可能是 160Kb 左右) )较旧的工具可能无法(有些限制为每行 4k)我建议您在应用乘法之前先将它们分解一下。
-
您需要多久处理一次这样的文件?如果您经常这样做,请记住拆分列将是最重要的瓶颈,您可以通过只关注您需要的列来节省时间,但这需要一些自定义编程:请参阅我的博客文章 Splitting long lines is slow。跨度>
-
我有大约 900 个文件,压缩后的大小从 500MB 到 3GB 不等。
-
这听起来与我遇到的问题相似。您肯定希望将文件压缩,并使用类似于我编写的例程来仅提取您想要的字段。新列是要添加到现有列中,还是替换特定列?
标签: python bash perl shell awk