Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 命令速度比“grep^GE”更快${TMPFILE2}"wc-l`_Unix_Grep - Fatal编程技术网

Unix 命令速度比“grep^GE”更快${TMPFILE2}"wc-l`

Unix 命令速度比“grep^GE”更快${TMPFILE2}"wc-l`,unix,grep,Unix,Grep,我正在寻找替代命令 grep^GE“${TMPFILE2}”wc-l 我的脚本中有六个类似的命令,它们寻找不同的模式,并将结果计数存储在变量中 上面提到的命令在TMPFILE2中搜索模式^GE需要花费大量时间,因为文件大小很大 有没有任何方法可以通过使用perl或awk来加速这个过程。 或 通过任何方法,我们都可以将这六个搜索合并为一个,并可以加快搜索速度吗?还有一种可能性 为了完整起见,您可以尝试并行搜索,看看操作系统对文件的缓存有多好 #!/bin/bash grep -c "^ISA" f

我正在寻找替代命令

grep^GE“${TMPFILE2}”wc-l

我的脚本中有六个类似的命令,它们寻找不同的模式,并将结果计数存储在变量中

上面提到的命令在TMPFILE2中搜索模式^GE需要花费大量时间,因为文件大小很大

有没有任何方法可以通过使用perl或awk来加速这个过程。 或
通过任何方法,我们都可以将这六个搜索合并为一个,并可以加快搜索速度吗?

还有一种可能性

为了完整起见,您可以尝试并行搜索,看看操作系统对文件的缓存有多好

#!/bin/bash
grep -c "^ISA" file > isa.tmp &
grep -c "^IEA" file > iea.tmp &
grep -c "^ST"  file > st.tmp  &
grep -c "^SE"  file > se.tmp  &
grep -c "^GS"  file > gs.tmp  &
grep -c "^GE"  file > ge.tmp  &
wait
isa=$(cat isa.tmp)
iea=$(cat iea.tmp)
st=$(cat st.tmp)
se=$(cat se.tmp)
gs=$(cat gs.tmp)
ge=$(cat ge.tmp)
echo $isa $iea $st $se $gs $ge
修改后的答案

现在,您已经为我们提供了搜索模式,可能还有其他选项:

#!/bin/bash
grep -E "^(ISA|IEA|ST|SE|GS|GE)" file > tmp$$
isa_count=$(grep -c "^ISA" tmp$$)
iea_count=$(grep -c "^IEA" tmp$$)
st_count=$(grep -c "^ST" tmp$$)
se_count=$(grep -c "^SE" tmp$$)
se_count=$(grep -c "^GS" tmp$$)
ge_count=$(grep -c "^GE" tmp$$)
echo $isa_count $iea_count $st_count $se_count $ge_count
或者这个:

awk '
    /^ISA/ {isa++;next}
    /^IEA/ {iea++;next}
    /^ST/  {st++;next}
    /^SE/  {se++;next}
    /^GS/  {gs++;next}
    /^GE/  {ge++;next}
    END{ print isa,iea,st,se,gs,ge}' file
原始答案

是的,使用egrep将它们全部集中在一起:

egrep "pattern1|pattern2|pattern3..." file
像这样:

egrep "pattern1|pattern2|pattern3..." file > tmp$$
grep -c pattern1 tmp$$
grep -c pattern2 tmp$$
read isa_count st_count gs_count iea_count se_count ge_count < <(awk .....)
如果可能,尝试将搜索定位在行的开头(使用
^


注意,我认为,
egrep
已被弃用,我们应该使用
grep-E

类似的方法应该可以:

awk '/^ISA/ { ++isa_count }
     /^ST/ { ++st_count }
     /^GS/ { ++gs_count }
     /^IEA/ { ++iea_count }
     /^SE/ { ++se_count }
     /^GE/ { ++ge_count }
     END { print isa_count, st_count, gs_count,
           iea_count, se_count, ge_count }' really_big_file.dat
您甚至可以将
awk
程序代码(单引号之间的内容)存储在单独的文件中,然后执行以下操作:

awk -f count_patterns.awk really_big_file.dat
不过,这只是将计数转储到标准输出上。要将它们放入shell脚本中的变量中,可以执行以下操作:

egrep "pattern1|pattern2|pattern3..." file > tmp$$
grep -c pattern1 tmp$$
grep -c pattern2 tmp$$
read isa_count st_count gs_count iea_count se_count ge_count < <(awk .....)

read isa_count st_count gs_count iea_count se_count ge_count<其他五个匹配项是什么?您可能会编写一个awk脚本来在一次过程中匹配(并计算)它们。我还将
-c
选项添加到grep中,这样它会返回行计数,而不是使用
wc
,我认为egrep会贬值。问题是我必须在单独的变量中维护计数,以便使用这些变量进行比较。命令如下。“码>iea计数计数<码>格雷普{{TMPFILE2}一个wc-liea计数<<码>格雷普{{TMPFILE2}}wc-l<<码>格雷普{码>格雷普{TMPFILE2}isa<<码>格雷普{码>格雷普{{{{{TmpPFIL2}一个isa{<<码>格雷普{{码>格雷普{上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述一个计数<<<<<码>格雷普{{码>格雷普{{{{{{{{{TmpPFfile2}{{TMPFILE2}2}{2}{2}}}}{2}}{2}}}}{T| wc-l
我正在寻找任何可以帮助我获得上述结果并且比上述结果更快的命令。感谢您的回复。该命令很好地提高了时间。但是我的文件有不同的计数,即大文件只有1个ISA,而小文件有1000个ISA。上述方法将在处理小文件时花费更多的时间。。有没有办法用一个命令来存储不同的计数而不创建新文件?我又添加了一个选项,您可以试试。不知道它将如何运行。谢谢您的回复。我尝试以time awk'/^SE/{++counter1}/^GE/{++counter2}END{print counter1,counter2}'10047_RP_2014070218075858_00001_5010.txt运行您的命令。这需要21秒,而两种模式的单个grep分别需要10.40秒。在时间方面似乎没有明显的改善。我正在搜索一个性能方面的选项。您能详细说明如何在变量中存储单个值吗?只需将
..
替换为前面示例中的命令行的其余部分即可-可以是明确拼写程序的命令行,也可以是将程序放入文件中的命令行。