首页 > 解决方案 > Unix Script 需要更长的时间,我们可以优化它吗

问题描述

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

假设第 2 列是关键列,如果第 2 列与下一行第 2 列匹配,则应转到重复文件,如果不匹配则应转到非重复文件。

Sam|1|IT|1st_Sem
Sam|1|CS|1st_Sem
Peter|2|IT|2nd_sem

应该转到重复文件并休息为非重复文件。

标签: unix

解决方案


产生外部cut会扼杀你的表现。在 awk 中完成所有操作:

    awk '{this=$2} 
    NR>1 {
        output = "exam" (this != prev ? "_non" : "") "_duplicate.txt";
        print last > output
    }
    {prev=this; last = $0} ' FS=\| input-file

(这使用您在第 2 列上键入的示例。$2根据需要进行更改。)请注意,这不会在任何地方写入文件的最后一行,但这很容易处理。


推荐阅读