seq_no=1
for line in `cat temp1_other.txt`
do
pk=`echo "$line" | cut -d '|' -f41`
seq_no=`expr "$seq_no" + 1`
line1=`sed -n ''$seq_no'p' temp1_other.txt`
pk_next=`echo "$line1" | cut -d '|' -f41`
if [ "$pk" == "$pk_next" ]; then
echo $line >> exam_duplicate.txt
else
echo $line >> exam_non_duplicate.txt
fi
done
尝试读取文件并将当前行列与下一行列进行比较以检查是否有重复记录,对于60k-70k的文件,它要花费20分钟以上的时间,我们可以对其进行优化还是用其他逻辑来实现? while循环也需要更长的时间。使用“ sort”命令对记录进行排序。
样本数据:
Sam|1|IT|1st_Sem
Sam|1|CS|1st_Sem
Sam|1|CS|2nd_Sem
Peter|2|IT|2nd_sem
Ron|2|ECE|3rd_sem
假设第二列是关键列,如果第二列与下一行第二列匹配,则应转到重复文件,如果不匹配,则应转到非重复文件。
Sam|1|IT|1st_Sem
Sam|1|CS|1st_Sem
Peter|2|IT|2nd_sem
应转到重复的文件,然后再休息至不重复。
答案 0 :(得分:1)
生成外部"EMR_COMMON.wxs"
会削弱您的性能。在awk中完成整个操作:
cut
(这将使用示例示例中的第2列键入内容。如有必要,请更改 awk '{this=$2}
NR>1 {
output = "exam" (this != prev ? "_non" : "") "_duplicate.txt";
print last > output
}
{prev=this; last = $0} ' FS=\| input-file
。)请注意,这不会在任何位置写入文件的最后一行,但是很容易处理。
答案 1 :(得分:1)
您正在运行Linux / bash吗?比你可以尝试
tac temp1_other.txt | sort -k2,2 -t'|' -u > exam_non_duplicate.txt
排序仅查找第二个字段,并希望保留它看到的第一条记录。
您希望最后一条记录为非重复记录,因此我们将cat
反转为tac
。
现在,您要保留所有重复的文件,可以尝试
grep -vFxf exam_non_duplicate.txt temp1_other.txt > exam_duplicate.txt
当您在exam_non_duplicate.txt
中提到其中一个真实的重复项(完全相同的行)时,此解决方案将失败。