unix - 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
应该转到重复文件并休息为非重复文件。
解决方案
产生外部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
根据需要进行更改。)请注意,这不会在任何地方写入文件的最后一行,但这很容易处理。
推荐阅读
- r - R - NLS 错误“评估模型时产生的缺失值或无穷大”
- oracle - 是否可以在 Spring Data JPA Repository 的 @Query 注释中使用 Oracle Anonymous Block?
- python - FastAPI & GINO 无法从数据库中的表中获取所有行
- python - 使用last对数据帧进行上采样后如何摆脱NaN?
- ansible - Ansible:如何在 CSV 文件中查找并填充相关文件内容
- qtimer - Qtimer:每 2000 毫秒调用一次不同的插槽
- javascript - 如何在功能组件之间获取道具?
- node.js - 为什么我的护照快递不再起作用了?
- mongodb - 将序列号添加到来自 mongodb 查询的项目
- angular - 如何从另一个项目开始创建一个全新的 Angular 项目?