我想找到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
答案 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
这种方法的缺点是:
FILE_B
grep
上完整传递
grep -f
是一个非常慢的操作,所以如果FILE_A
或FILE_B
非常大,这将会很慢您可以通过将sed
操作的输出保存到临时文件来缓解问题1,从而在FILE_B
上保存第一次传递。您可以通过加入FILE_B中的所有行来缓解问题2,使用|
分隔每一行,并将其作为单个大量grep
运行。