Unix脚本需要更长的时间,我们可以优化它

问题描述 投票:0回答:2
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

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

unix
2个回答
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中提到其中一个时,如果您有真正的重复项(完全相同的行),此解决方案将失败。


1
投票

产卵外部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。)请注意,这不会在任何地方写入文件的最后一行,但这很容易处理。

© www.soinside.com 2019 - 2024. All rights reserved.