对有序的大文件的去重排序,首先确定文件大小,分割比例,直接上代码:
#!/bin/bash
#号是注释
#文件名称,改为自己的实际文件路径
#文件内容每行都类似 2ff9a2acc|8.0.0.168|Anc|6.1x64|2052|2018-01-25
split_file_name=logon.txt
#去掉空格统计文件行数
lines=`wc -l $split_file_name | sed 's/ .*//g'`
#确定等比例分割的行数,这里分成20个文件
lines_per_file=`expr $lines / 20`
#分割文件 -d可以设置文件大小,这里没设置, -l设置文件行数,这里设置了 $lines_per_file 行
#分割后的文件类似 __part_logon.txt01 __part_logon.txt02
split -d -l $lines_per_file $split_file_name __part_$split_file_name
#循环处理__part_开头的文件
for file in __part_*
do
{
#按照文件中的|符号分割排序 -r -k2,2表示对8.0.0.168这一列排序 -r排序
#然后去重文件 -u -k1,1 -k3,3表示同时对2ff9a2acc列和Anc列去重
# -u表示去重 -o表示写入文件 这里是写入以sort_开头的文件
sort -f -t "|" -r -k2,2 $file | sort -f -t "|" -u -k1,1 -k3,3 -o sort_$file
}
done
#同时对 sort_开头的文件去重并输出覆盖原来的logon.txt文件
sort -smu sort_* > $split_file_name
#然后删除分割的与分割排序去重的文件
rm -f __part_*
rm -f sort_*