2017-06-26 10 views
0

リストAの最初のエントリがリストBにも存在することを見つけるために、BASHの素晴らしい方法を考え出しています。 ABは別々のファイルにあります。上記の例ではbash:別のリストにも存在する最初の値リストを特定する

A   B 
1024dbeb 8e450d71 
7e474d46 8e450d71 
1126daeb 1124dae9 
7e474d46 7e474d46 
1124dae9 3217a53b 

7e474d46Bに登場Aの最初のエントリで、だから私は7e474d46を返します。

注:Aは数百万のエントリすることができ、かつBは、いくつかのポイントは次のように、明確ではないものの周りに300

+0

ですか?あなたはこれをどこにでも言及していません。両方の答えは、ファイル内にこれらのエントリがあるという前提に基づいています。しかし、あなたの疑問に「何百万ものエントリ」があることを見ていると、私はこの仮定について少し懐疑的に思っています。 – sjsam

+0

ファイルには、固定幅の16進数のASCII形式のバイナリ値が含まれています。これらの値は、実際のデータのサブセットです。 "A"ファイルは100 + Megsで、 "B"ファイルは1-ish Megsです。センサーデータなので、最初のイベントを探しています。それらのデータは固定幅です。 –

+0

@sjsam 2つのファイルがあるので、質問を明確にしました。質問を扱い易くしようとすることで事を単純化しました。 :/ –

答えて

1

awkはあなたの友人です。

awk 'NR==FNR{a[$1]++;next}{if(a[$1]>=1){print $1;exit}}' file2 file1 
7e474d46 

注:値は2つのカラムとして単一のファイルに記載されていることを前提とあまりにもこの答えの[ previous version ]を確認してください。これは、値が[ this ]コメントの2つのファイルとして供給されることを明確にした後に書かれています。

1

することができますどのように、リスト内の数が2倍以上に来ている場合について(?あなたの与えられた例では、d46は2回になる)。リストBにあるリストAのすべての行番号が必要であることを考慮すると、次の行が同じように役立ちます。コード上

awk '{col1[$1]=col1[$1]?col1[$1]","FNR:FNR;col2[$2];} END{for(i in col1){if(i in col2){print col1[i],i}}}' Input_file 

OR(上記溶液のNON-1ライナー形式)

awk '{ 
     col1[$1]=col1[$1]?col1[$1]","FNR:FNR; 
     col2[$2]; 
    } 
     END{ 
       for(i in col1){ 
           if(i in col2){ 
               print col1[i],i 
              } 
           } 
      } 
    ' Input_file 

以下の出力を提供します。

3,5 7e474d46 
6 1124dae9 

ここで、インデックスが最初のフィールドで、インデックスが$ 2の配列col2という配列col1を作成します。 col1の値は現在の行の値であり、それ自身の値も連結します。今度はawkのENDセクションでcol1配列を走査し、次にcol1の値が配列col2にも存在するかどうかをチェックし、yesならcol1の値とそのインデックスを出力します。

0

あなたがGNUのgrepのを持っている場合、あなたはこれを試すことができます:それはこれらのエントリが含まれているファイル

grep -m 1 -f B A 
関連する問題