我在多个目录中有多个文件。我从他们那里搜索grep的关键字“能源”。在每个文件中,我有多个匹配案例。我想从每个文件中获取最后一行并将结果保存在output.txt文件中。我写了以下代码:
labl=SubDir
ENERGY=`grep 'ENERGY' MyDir*${labl}*/*.txt`
cat > output.txt << EOF
${ENERGY}
EOF
此代码保存每个文件中的所有匹配案例。但是如上所述,我需要每个文件的最后一个匹配大小写。为此,我将grep命令修改为:
ENERGY=`grep 'ENERGY' MyDir*${labl}*/*.txt|taile -l`
不幸的是,这也不起作用。而是只保存最后一个文件中的所有匹配项。
如何解决?
答案 0 :(得分:2)
请不要运行多个进程/管道来实现此目的。
gawk '/ENERGY/{last=$0} ENDFILE{if(last!="") print last; last=""}' MyDir*"$labl"*/*.txt
/ENERGY/{last=$0}
:在与正则表达式ENERGY
匹配的行上,将变量last
设置为整行$0
ENDFILE{...}
在全局文件提供的每个输入文件的末尾运行此{action}
。
if(last!="") print last
:如果不为空,则打印last
last=""
:将此变量重置为null,避免重复
MyDir*"${labl}"*/*.txt
:glob中带引号的变量将匹配包含空格的目录名称
答案 1 :(得分:0)
使用for
循环:
for f in MyDir*"$lab1"*/*.txt; do
grep ENERGY "$f" | tail -1 >> output.txt
done
答案 2 :(得分:0)
然而,但并非最后一种可能的方法是使用类似的并行方法。也许您可以使用xargs达到相同的效果,但是我个人更喜欢使用parallel,因为它更简单,并且可以扩展您的过程。
ls -1 file* | parallel -j1 "grep ENERGY {} | tail -n 1" > output.txt