现有2个文本,一个id.txt,一个item.txt
id.txt里面只有一列,是数字id,部分id有重复。总共有430多行。
item.txt里面有两列,第一列数字id,和id.txt里面可以一一匹配,第二列是对应的一个值。总共2000多行。item.txt是有序的,也就是说第一行是数字id 1 和它对应的一个值(注意这个特点)
需求:根据id.txt里面的id找到对应的值,并生成一个记录文件,顺序不能打乱。
这问题,我首先想到的就是两层循环搞定,结果很蛋疼,先把这第一版的代码贴出来。(固有思维很可怕)
#!/bin/bash #version 1.0.0 #石头 for i in `cat id.txt` do echo -n $i" " >> jieguo.txt for j in `cat item.txt` do if [ $i = `echo $j | cut -d ":" -f1` ];then echo $j | cut -d ":" -f2 >> jieguo.txt fi continue done done
好了,代码贴出来了,为什么很蛋疼,因为这个循环是400*2000,所以导致结果就是执行完得一个小时,于是我想更加优化一下,没的说,外面这层循环是没法再优化了的,只能这样了,那就把目光放在里面这个循环上来考虑。首先想到的是把判断条件优化,不要这么复杂,其次是管道是否可以省去改用其它办法。但是不管怎么改,优化效果都还是太差,之前同事是手动操作的,我还去看了一下他操作的过程,就是从id.txt里面选一个id然后去item.txt里面去比对搜索,这里我记得他用的是UE编辑器,前面显示的有行号,行号刚好和item.txt的第一列的id数值相等,也就是前面说的item.txt是有序的这个关键特点。接下来就出了第二版,直接根据id.txt取出的id,直接读取item.txt的第id行就好了,这就是我要的结果。
#!/bin/bash #version 1.0.0 #石头 for i in `cat id.txt` do j=`expr $i + 0` #将取到的变量i数字化 sed -n ${j}p item.txt >> jieguo1.txt #直接读取第j行的数据,并重定向至文本记录 done
到此结束,中间的循环判断什么的全部没了,脚本只要两秒就完事了。也许这只是一个简单的东西,
但告诉我思维要放活,要充分利用现有资源,现有特点。当然如果item.txt不是有序的,那就不能这样干了。
至此谨记。脚本简单,高手勿喷。
养成记笔记的好习惯,不让学到的东西从指间溜走。
欢迎加2000人技术QQ群一起学习探讨linux相关知识:100094104
-
« 上一篇:
VSFTP访问FTP用户根目录以外的公共数据实现方法