我正在寻找替代命令
grep ^GE "${TMPFILE2}" | wc -l
我的脚本中有六个类似的命令正在寻找不同的模式并将结果的数量存储在变量中。
上面提到的命令花了很多时间在TMPFILE2中搜索模式^ GE,因为文件大小很大
有没有办法通过使用perl或awk来加速这个。 要么 通过任何方法我们可以将这六个搜索结合在一起并加快速度吗?
答案 0 :(得分:2)
更多可能性
为了完整起见,您可以尝试并行搜索,看看您的操作系统缓存文件的效果如何!
#!/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$$
尽可能将搜索锚定在行首(使用^
)。
注意,我认为egrep
已被弃用,我们应该使用grep -E
代替。
答案 1 :(得分:0)
这样的事情应该有效:
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脚本中的变量,您可以执行以下操作:
read isa_count st_count gs_count iea_count se_count ge_count < <(awk .....)
这种方法的优点是它只扫描文件一次以产生所有计数。
编辑:已更新以使用答案中的实际示例模式。