2014-10-13 66 views
0

我想要從FILE_B到的第8到第17位數字僅查找FILE_A的值。使用grep查找每行中的字符串

FILE_B包含:

$cat FILE_B 
9237770 
63943100 
6393390990 

FILE_A包含

$cat FILE_A 
50000092280794230000092384245540 
50000092280938880000009237770528 
50000092377704630000009154893441 

輸出應該

50000092377704630000009154893441 

自8日 - 17日(9237770463)數字包含(這是在FILE_B )

我有一個腳本,但沒有給我確切的輸出。

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

輸出:

9237770 

回答

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打印這些行
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一個完整的通運行grep
  2. grep -f之前是一個相當緩慢的操作,所以如果FILE_AFILE_B真的很大,這會很慢

您可以通過將sed操作的輸出保存到臨時文件來緩解問題1,從而將第一遍保存在FILE_B上。您可以通過連接FILE_B中的所有行來減輕問題2,將每行與|分開,並將其作爲單個大量grep運行。