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
应该转到重复文件并休息到非重复。
你在运行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
中提到其中一个时,如果您有真正的重复项(完全相同的行),此解决方案将失败。
产卵外部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
。)请注意,这不会在任何地方写入文件的最后一行,但这很容易处理。