最近需要对256G的txt文件做排序,参考文章如何对一个大文本进行按每行去重操作?写了如下脚本
代码语言:javascript复制#! /bin/ksh
#Cleanup any lefover files
rm -f *.sorted > /dev/null
rm -f sorted.file
#Splitting $ORIGINAL_FILE into chunks ...
#split -l $MAX_LINES_PER_CHUNK -a 4 $ORIGINAL_FILE $CHUNK_FILE_PREFIX
for file in *.txt
do
sort $file > $file.sorted &
done
wait
#Merging chunks to $SORTED_FILE ...
sort -m *.sorted > sorted.file
#Cleanup any lefover files
rm -f *.sorted > /dev/null
可以比较快的得到排序后的文件sorted.file,但是如果要去掉重复记录的话就需要更改脚本 在sort -m *.sorted > sorted.file下面增加
代码语言:javascript复制sort -u -m *.sorted > sorted.file.uniqe
这样可以获得两个文件,然后使用diff比较就可以得到重复数据
代码语言:javascript复制diff sorted.file sorted.file.uniqe
818d817
< 1b9f36864e9b343c9456afea1f1c4318a3b06b0729c49113b888e68204667e0037348d55fb3fdd9fbbe1d2d7b2ec498dbc6fdb9119673d1cf681ce1d272d2f5f0c227daa3bfc0053891153e0ff197826b2a2ada24e9b1651d53f21c66baeba3db7340b04b4ae87fe33eab4d19a31c1cc9f654ebdd5d17f31847ae062be1b92bd
实际运行中,由于我需要排序的文件在200G以上,因此出现下面的问题: /tmp/sortA3aLjF: No space left on device
查看tmp空间确实不够用,查看info sort,看到
The -T option allows you to specify somewhere else besides /tmp for sort
to put its stuff.
因此修改脚本如下:
#! /bin/ksh
#Cleanup any lefover files
rm -f *.sorted > /dev/null
rm -f sorted.file
#Splitting $ORIGINAL_FILE into chunks ...
#split -l $MAX_LINES_PER_CHUNK -a 4 $ORIGINAL_FILE $CHUNK_FILE_PREFIX
for file in *.txt
do
sort -T /data1 $file > $file.sorted
done
wait
#Merging chunks to $SORTED_FILE ...
sort -T /data1 -m *.sorted > sorted.file
sort -T /data1 -u -m *.sorted > sorted.file.uniqe
#Cleanup any lefover files
#rm -f *.sorted > /dev/null
其中/data1/目录是另外一个2T的独立磁盘