インデックスファイルで正確に一致しない一致を見つけ、最後のフィールドを印刷します。

インデックスファイルで正確に一致しない一致を見つけ、最後のフィールドを印刷します。

次の2つの列を持つ大きなファイル(〜600万行)があります。

1111.aaaaabbb.b.cccc.c  ValueA
2222.dddddeee.e.ffff.f  ValueB
3333.gggghhhh.h.iiii.i  ValueC

この単一の列ファイルを検索するときにこれをインデックスとして使用したいと思います。

aaaaabbb.b  
dddddeee.e  
gggghhhh.h  

そして、次を返します。

ValueA
ValueB
ValueC
[...]
Valuen

ご覧のように、2番目のファイルの内容が最初のファイルの内容と正確に(正確ではないが)一致する限り、最初の期間以降の値にのみ興味があり、最初のファイルの2番目の値を返したいと思います。列値ファイル。ファイル2の内容が正確に一致する限り、最初のファイル内容の接頭辞/接尾辞は気にしません。

これを行う方法awkやツールはありますか?bash現在、Excel(Data to Column Tool)でデータ型を正しく指定しようとしていますが、600万を超える行があるため、手動で6つのファイルを実行してから結果を一緒にコンパイルする必要があるため、時間がかかります。

編集する内容file1:接頭辞は常に数字ですが、長さは4桁から7桁まで異なります。最初のピリオドの後の内容は英数字で、長さは4〜15文字で、数字または文字で始まり、サフィックスも数字/文字にすることができます。

答え1

インデックス付きのファイルは大きすぎず、メモリに完全にロードできると仮定します。その場合は、次のものを使用できますawk

awk -F"[. ]" 'FNR==NR{a[$0]=1} FNR!=NR&&a[$2"."$3]{print $NF}' index_file huge_file

  • awkindex_file検索する内容とhuge_file質問の複数行を含む2つのファイルが呼び出されます。
  • -F"[. ]"awks 区切り文字をスペースとドットに設定します。
  • FNR==NR以下にのみ適用されます。index_file
    • a[$0]=1配列は、検索パターンをインデックスとして使用して配列を埋め、a値をに設定することで構成されます。1
  • FNR!=NRにのみ適用されますhuge_file
  • a[$2"."$3]点で連結されたfield2とfield3の配列インデックスが存在する場合(パターンが見つかった場合)...
    • print $NFファイルの最後のフィールドを印刷します。

出力:

ValueA
ValueB
ValueC

関連情報