Sed grep的替代方案

Sed grep的替代方案,sed,awk,grep,Sed,Awk,Grep,我正在使用“grep”在2.txt中的1.txt中寻找一些模式。然后做一些操作。 但是,似乎“grep”对于大文本来说太慢了 for (( i=1; i<=236410; i++ )) do head -$i 1.txt|tail -1|grep -f - 2.txt|awk '{mul+=$4*$7} END {print $1,$2,$3,mul}' done > file1 ((i=1;i文件1)的 我只是想知道是否有其他选择?似乎awk/sed可以做到这一点,但

我正在使用“
grep
”在2.txt中的1.txt中寻找一些模式。然后做一些操作。 但是,似乎“
grep
”对于大文本来说太慢了

for (( i=1; i<=236410; i++ ))
do 
    head -$i 1.txt|tail -1|grep -f - 2.txt|awk '{mul+=$4*$7} END {print $1,$2,$3,mul}'
done > file1
((i=1;i文件1)的

我只是想知道是否有其他选择?似乎
awk/sed
可以做到这一点,但只是不知道如何将变量
head-$i1.txt | tail-1
导入awk或sed


thx

假设您的模式文件有236410行,并且假设
grep
可以处理该数量的输入,并且假设输出文件的顺序不重要,为什么不这样做呢

grep -f 1.txt 2.txt | awk ... >file1
如果内存有问题,而您的输入是静态字符串,请尝试使用
fgrep
;它可以处理大量的模式。如果输出的顺序实际上很重要,那么类似这样的操作应该会快得多

while read line; do
  grep "$line" 2.txt | awk ...
done <1.txt >file1
如果以上任何一项都不适合您,那么这里有另一个想法。因为您正在使用
awk
进行实际处理,因此您可能能够将所有处理重构为
awk
脚本,或者动态创建
sed
脚本,并将该脚本的输出传递给
awk
。这有点复杂,而且取决于这是关于你的模式是什么样子的,但类似这样的东西应该会给你一个想法:

sed 's%.*%/&/p%' 1.txt | less
您所看到的是一个
sed
脚本,如果
1.txt
中的每个模式都匹配,它就会打印出来(如果任何模式包含正斜杠,它就会中断。在简单的情况下,使用不同的分隔符,或者转义模式中的所有斜杠)。现在您可以将其保存到文件中,或者(如果您的
sed
可以通过标准输入处理脚本)将其传递给
sed
的第二个实例:

sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | less
这就是您要传递给awk的内容:

sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | awk ... >file1

你的
/
组合很慢。是的,你为什么一次只走一行而不是整件事?我怎么能走整件事?
sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | awk ... >file1