我有几个巨大的制表符分隔文件 @ 每个 ~2.1 TB,~8.5 K 行,~39.3M 列。第一列是可变长度的所有字符串(ID),其余是零后三个位置的非负固定精度小数(即,ID 之后的每一列都是 5 个字符长 0.000)。
在具有 256GB RAM 的 Linux 机器中转置文件的最有效方法是什么?最终,在转置之后,我想将文件分成 500K 行,以便我可以开始处理它。硬盘没问题,有70TB的可用空间。
这是我能想到的(每个文件大约需要 2.5 天)。问题是每个文件的行数和列数都略有不同。我不想在每次运行时都修改脚本。或者,我可以编写一个专门的 C 程序来执行此操作,但我不愿意这样做。
#!/bin/bash
i=$1
mkdir temp-$i
cd temp-$i
echo "Splitting $i"
split -dl 1 -a 4 ../$i
echo "Transposing all lines"
for a in x???? ; do
cat $a | sed 's/\t/\n/g' > $a.txt
mv $a.txt $a
done
echo "Joining all columns"
# Here's where it gets really ugly:
paste x0000 x0001 ... x0999 > a.txt
paste x1000 x1001 ... x1999 > b.txt
paste x2000 x2001 ... x2999 > c.txt
paste x3000 x3001 ... x3999 > d.txt
paste x4000 x4001 ... x4999 > e.txt
paste x5000 x5001 ... x5999 > f.txt
paste x6000 x6001 ... x6999 > g.txt
paste x7000 x7001 ... x7999 > h.txt
paste x8000 x8001 ... x8499 > i.txt
paste ../colinfo-$i.txt a.txt b.txt c.txt d.txt e.txt f.txt g.txt h.txt i.txt > ../tr-$i.txt
cd ../
rm -Rf temp-$i