【问题标题】:Iterating grep over and over. How can I make my script faster?一遍又一遍地迭代grep。如何让我的脚本更快?
【发布时间】:2015-07-31 21:00:27
【问题描述】:

我必须从另一个文件中的一个文件中找到一串数字。 我的代码是这样的:

#!/bin/sh
IFS="F"
while read f1 f2
do
  LC_ALL=C fgrep -m 1 "$f1" BC_Tel.inp
done < telephonelist.txt

数字字符串位于telephonelist.txt 中。这个文本文件的格式如下:

8901040000001304669F    370040000130466 
8901040000001317380F    370040000131738 
8901040000001330045F    370040000133004 
8901040000001330052F    370040000133005 
8901040000001330060F    370040000133006 

我在 BC_Tel.inp 中查找上述数字以“F”分隔的行,格式如下:

981040000030289765F1 655F370D1E86260ED550A2D6F80EFF96 01000045384136453332440303FFFFFFFFFFFFFFFF0000 01000037333643383234380303FFFFFFFFFFFFFFFF0000 083907400030289765 00000031323334FFFFFFFF030334303733323638310AFF 01000034383532FFFFFFFF030334333738333137320AFF 0020 01007F107FD2266C31249530FC531B474F6D44482C007F007F007F007F007F007F007F007F007F007F007F007F007F007F007F107F97AB34277D5378AEC893716281F99ABC007F007F007F007F007F007F007F007F007F007F007F007F007F007F007F107F6608B51E4378BE23072E843D6741A184007F007F007F007F007F007F007F007F007F007F007F007F007F007F 636C8D46973FAE4C1BD181BB4E0D4DA2A5E0455E86406CCF40F309F63470CE07 000003817826FF0187494010083A65626501586519104106 083907400030289765636C8D46973FAE4C1BD181BB4E0D4DA2 080900000000101003636C8D46973FAE4C1BD181BB4E0D4DA2 8901040000038279561 40732681

telephonelist.txt 和 BC_Tel.inp 是超过一百万行的巨大文件。该脚本工作正常,但我想让它更快。我基本上是在 txt 文件上运行一次,但我在 .inp 文件上一遍又一遍。我该如何让这个过程更快?

tl;博士 我想优化我的代码,让它运行得更快。

【问题讨论】:

  • 这里的想法是简单地在.inp 中找到与.txt 文件中的任何第一个字段(没有尾随F)匹配的每一行吗? .inp 文件中的哪个字段是匹配的(您的示例行都没有出现在我能分辨的任何地方)。
  • 是的,就是这样。 .inp 中与之匹配的字段是倒数第二个。
  • -m 1 仅匹配一行(因此不会匹配多行)。更像LANG=C fgrep -w -f &lt;(awk '{$0=$1; gsub(/F$/, "")}7') BC_tel.inp 的东西可能会做你想做的事。话虽如此,如果您有内存将 .txt 文件中的字段存储在内存中,那么 awk 脚本可能是更好的解决方案。

标签: performance shell optimization grep sh


【解决方案1】:

一个grep 就可以做到:

cut -d"F" -f1 telephonelist.txt | grep -F -m1 -f- BC_Tel.inp

grep 的-f 选项提供了一个包含模式的文件名。在这里,我们使用文件名- 来表示“stdin”。

【讨论】:

  • 这可行,但我的.inp 文件实际上与telephonelist.txt 一样长。我只是举个例子来说明格式是怎样的。我怎样才能使它工作,以便它遍历telephonelist.txt 中的所有数字,而不仅仅是第一个?
  • 我不明白你的担心:cut 命令将输出电话列表中的所有号码,而不仅仅是第一个号码。
猜你喜欢
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多