【发布时间】: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 <(awk '{$0=$1; gsub(/F$/, "")}7') BC_tel.inp的东西可能会做你想做的事。话虽如此,如果您有内存将.txt文件中的字段存储在内存中,那么 awk 脚本可能是更好的解决方案。
标签: performance shell optimization grep sh