用于处理大型数据集的缓慢while循环的awk替换

时间:2017-11-04 12:04:55

标签: shell awk while-loop

我有一个shell脚本,它从文件中读取一个手机号码,并与另一个文件进行比较,以确定该号码属于哪个区域。我必须检查该系列是否是该号码的前4位数字或前5位数字,它给我操作员和该号码所属的区域。

如果我执行此任务的时间大约为500k,那么这个脚本的执行时间在24核和64 GB RAM的机器上大约需要2个小时,这是一种耻辱,因此我在这里找到一个更好的方法更有效地执行相同的任务。

我的代码是 -

 while read num
 do

 num4=$(echo $num | awk '{print substr($0,0,4)}'); #First 4 digits 
 num5=$(echo $num | awk '{print substr($0,0,5)}'); #First 5 digits

 taco=$(grep -w $num5 db.txt | wc -l); #Count if found in file db.txt
 taca=$(grep -w $num4 db.txt | wc -l); #Count if found in file db.txt

 if [ "$taco" -eq 0 ]; then

   if [ "$taca" -eq 0 ]; then 
      grep "$num4" mobile_db.txt >> operator_temp.txt  #If not found in db.txt file then check in different file
      else
      grep -w $num4 db.txt >> operator_temp.txt #Copy the content found to a file
   fi

  else

  grep -w $num5 db.txt >> operator_temp.txt #Copy the content found to a file
 fi

  done < output_num_temp.txt

db.txt文件的示例是 -

7101    Idea    UttarPradesh(West)
7107    RelianceMobile  MadhyaPradesh
7108    RelianceMobile  Gujarat
7110    RelianceMobile  Rajasthan
73027   Airtel  UttarPradesh(West)
73028   Airtel  UttarPradesh(West)
73029   Airtel  UttarPradesh(West)
91210   Airtel  AndhraPradesh
91211   Airtel  AndhraPradesh
91212   Airtel  AndhraPradesh

这也是mobile_db.txt的示例,这是将存储在文件operator_temp.txt中的预期输出

1 个答案:

答案 0 :(得分:2)

它的声音就像你需要的那样:

. use

但是没有更明确的要求和更多关于输入文件的信息,以及简明,可测试的样本输入和问题中的预期输出,这只是猜测。

只要您的2个db文件不是非常庞大,上面应该会在几秒钟而不是几小时内运行。有关不应使用shell循环来操作文本的众多原因的讨论,请参阅https://unix.stackexchange.com/q/169716/133219