使用grep在每一行中查找字符串

时间:2014-10-13 02:41:56

标签: unix grep cut

我想找到FILE_B到第8-17位的值,只有FILE_A。

FILE_B包含:

 $cat FILE_B
 9237770
 63943100
 6393390990

FILE_A包含

 $cat FILE_A
 50000092280794230000092384245540
 50000092280938880000009237770528
 50000092377704630000009154893441

输出应该

  50000092377704630000009154893441

因为8月17日(9237770463)数字包含 9237770 (在FILE_B中)

我有一个脚本,但没有给我确切的输出。

 $cut -c 8-17 FILE_A | grep -f FILE_B

输出:

 9237770

2 个答案:

答案 0 :(得分:0)

尝试此命令:

cut -c 8-17 FILE_A |
   grep -nf FILE_B |
     cut -d: -f1 |
       awk 'FNR==NR{a[$1];next};FNR in a' - FILE_A
  • -n添加grep选项以打印行号(建议fgrep
  • 然后cut这些数字
  • 使用awk打印这些行

答案 1 :(得分:0)

如果您想基本上推断已经完成的工作,可以使用sed预处理FILE_B,使其成为真实正则表达式列表:

例如:

sed 's/.*/^.\{6\}&.*$/' FILE_B

可生产

^.{6}9237770.*$
^.{6}63943100.*$
^.{6}6393390990.*$

你可以像这样使用它:

egrep -f <(sed 's/.*/^.\{6\}&.*$/' FILE_B) FILE_A

这种方法的缺点是:

  1. 在运行FILE_B
  2. 之前,它会在grep上完整传递
  3. grep -f是一个非常慢的操作,所以如果FILE_AFILE_B非常大,这将会很慢
  4. 您可以通过将sed操作的输出保存到临时文件来缓解问题1,从而在FILE_B上保存第一次传递。您可以通过加入FILE_B中的所有行来缓解问题2,使用|分隔每一行,并将其作为单个大量grep运行。