我在linux中有一个只有1行的~200MB文件。我需要一个能够快速返回该行/文件中出现字符串序列的第一个位置的命令。
示例:文件中行的开头是“43525346465746123”,如果输入5746,则返回11。
我已经在使用awk命令了
awk -v find=5746 '{ printf ("%s", index($0,find) ) }' file
但是对于200MB文件,此命令大约需要6秒。有更快的方法吗? 我还希望它返回序列前后的几个字符。在上面的例子中,它们将是:646和123
答案 0 :(得分:1)
尝试使用sed(我不知道它将如何与您的数据进行比较,所以请告诉我们):
sed -n "s/^.*(...5746...).*$/\1/p" file
我现在没有系统来测试这个,但这里的理论是:
-n
:默认情况下不打印每一行(如果找不到搜索字符串)s
:替换^.*
:从开始,吃掉所有的角色,直到...... (...5746...)
:捕获搜索字符串和一些周围的字符.*$
:吃剩下的一行\1
:用捕获p
:打印(仅限匹配时)编辑:或尝试grep(再次,请告诉我们您的数据的性能):
grep -o "...5746..." file
答案 1 :(得分:1)
不知道它会如何扩展,但你可以尝试:
grep -o -P '.*?5746' | echo "`wc -m`-3" | bc
处理非贪婪的正则表达式需要 -P
,因为上面没有它会匹配整个字符串直到(并包括)˙5746
的最后一次出现。 -o
仅输出匹配的模式,然后wc -m
计算字符数,但它也包含模式,因此应该递减(例如使用bc
)。