优化grep -f管道命令

时间:2018-12-17 21:47:45

标签: bash awk grep

我有两个文件。

file1的某些键的第二列开始为abc

et1 abc
et2 abc
et55 abc  

file2具有第1列的值和我需要累加的一些其他数字:

1 2 3 4 5 et1
5 5 5 5 5 et100
3 3 3 3 3 et55
5 5 5 5 4 et1
6 6 6 6 3 et1

对于file1中提取的键,如果匹配,我需要加起来对应的第5列。 File2本身非常大

该命令似乎可以正常运行,但速度很慢:

 egrep -isr "abc" file1.tcl | awk '{print $1}' | grep -vwf /dev/stdin file2.tcl | awk '{tl+=$5} END {print tl}'

我将如何优化管道。另外我用grep -f做错了什么。通常不建议这样做吗?

编辑:当file1中存在column6键时,预期输出是file2中所有column5的总和

Edit2:预期输出:由于文件1具有键“ et1,et2和et55”,因此在file2中将第5列与第1,3,4和5行中的匹配键相加,因此预期输出为[5 + 3 + 4 + 3 = 15]

2 个答案:

答案 0 :(得分:1)

使用单个awkfile1读入数组的键。然后,在读取file2时,当$5在数组中时,将$6添加到总变量中。

awk 'NR==FNR {if ($2 == "abc") a[$1] = 0; 
              next}
     $6 in a {total += $5}
     END { print total }
    ' file1.tcl file2.tcl

答案 1 :(得分:1)

请先阅读Input_file2.tcl并减少循环,然后尝试以下操作。由于您的预期输出不清楚,因此尚未完全测试。

awk 'FNR==NR{a[$NF]+=$(NF-1);next} $2=="abc"{print $1,a[$1]+0}'  file2.tcl file1.tcl