随笔--一个Shell小脚本--帮同事处理一个excel表格问题而来

发表于 LINUX 分类,标签:

 现有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




 

 

0 篇评论

发表我的评论