5

我正在寻找有关 grep 或 grep 之类的工具的帮助。这包括但不限于 grep、egrep、awk、sed 或任何其他用于搜索匹配项的工具。但对于剩下的问题,我只会称它为 grep。

我正在寻找 grep 匹配文件的快速方法,并且我也在寻找 grep 匹配文件的最快方法,并且只返回行号而不是匹配行的其余部分。我不介意语法是否复杂,只要它快,我将在程序中使用它复杂性不是问题。

如果我需要对模式进行正则表达式,我也需要这种方法才能工作,这样我也可以搜索范围。因此,如果我需要搜索所有小于 10 的数字(如果命令默认支持它)或者它需要一些正则表达式,我只是在寻找我能找到的最快的方法。

谢谢你。

编辑

我正在使用的文件会非常大,我的测试文件是 1.9gb

4

5 回答 5

6

我认为 KingsIndian 可以-m选择 grep,但如果速度是您的主要目标,cut则可能比awk这种特殊用途更快。尝试:

grep -n -m 1 regex file | cut -d: -f1

参数告诉 cut使用-d:冒号作为字段分隔符,而-f1参数告诉它只输出第一个字段。

于 2012-09-17T16:37:18.653 回答
3

在第一场比赛后停止:

grep -n -m 1 str file | awk -F: '{print $1}'

您可以将 的参数值更改m为不同的值,以在那么多匹配后停止。该awk部分仅捕获行号。

在 5 场比赛后停止:

grep -n -m 5 str file | awk -F: '{print $1}'

编辑:
您可以使用tail它。例如,要跳过前 5 个匹配项并打印接下来的 7 个:grep -n -m 12 str file| tail -7 | awk -F: '{print $1}'

于 2012-09-16T23:50:08.803 回答
1

您可以使用GNU awk并简单地打印出行号进行模式匹配:

awk '/regex/ { print NR }' file.txt

假设值是空格分隔的,如果行包含小于 10 的数字,您可以找到行号:

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) print NR }' file.txt

但是,这将打印每次出现小于 10 的数字的行号。我相信您可能会觉得这是不可取的。因此,要删除每个匹配项的多个重复行号,您可以使用数组:

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) array[NR]++ } END { for (i in array) print i }' file.txt

如果您需要排序输出,请通过管道传输到sort -n. 如果您更喜欢更优雅的解决方案(即没有管道):

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) array[NR]++ } END { for (j in array) sorted[k++]=j+0; n = asort(sorted); for (j=1; j<=n; j++) print sorted[j] }' file.txt

编辑:

awk上面最后三个命令中的任何一个中,只需更改if ($i <= 10)if ($i >= 11 && $i <= 20)以显示结果 11 到 20(包括)。

于 2012-09-17T01:17:34.033 回答
1

我不确定这是否很快,但这似乎有效:

nl -b a "<filename>" | grep "<phrase>" | awk '{ print $1 }'
于 2012-09-16T23:52:02.743 回答
1

我刚刚使用非分叉 sed 调用进行了一些测试,但并不幸运,但在这里参考带有 1 GB 文本文件的数字,其中我的 $PATTERN 是最后一行的一部分:

(剧透:grep 在此操作上快 5 倍以上,awk 最慢)

user@box:~$ ls -lh /dev/shm/test
-rw-r--r-- 1 用户用户 979M 7 月 8 日 09:50 /dev/shm/test
user@box:~$ sed --version | 头-n1
GNU sed-版本 4.2.1
user@box:~$ time sed -n "/$PATTERN/{=;q}" /dev/shm/test
206558

真实0m6.835s
用户 0m6.160s
系统 0m0.648s
用户@box:~$ grep -V | 头-n1
grep (GNU grep) 2.14
user@box:~$ time grep -n -m 1 "$PATTERN" /dev/shm/test | 剪切-d:-f1
206558

真实0m1.337s
用户 0m0.592s
系统 0m0.736s
user@box:~$ awk --version | 头-n1
GNU awk 4.0.1
user@box:~$ time awk "/$PATTERN/ { print NR }" /dev/shm/test
206558

真实0m7.176s
用户 0m6.356s
系统 0m0.776s

于 2015-07-08T07:58:32.963 回答