2021-04-02 大文本文件数据查重

最近需要对256G的txt文件做排序,参考文章如何对一个大文本进行按每行去重操作?写了如下脚本

#! /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下面增加

sort -u -m *.sorted > sorted.file.uniqe

这样可以获得两个文件,然后使用diff比较就可以得到重复数据

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的独立磁盘

你可能感兴趣的:(2021-04-02 大文本文件数据查重)