Unix - Awk - 部分一致(文字列内)による 2 つのファイルのマッチングとマージ

Unix - Awk - 部分一致(文字列内)による 2 つのファイルのマッチングとマージ

FileA.txt と FileB.txt という 2 つのテキスト ファイルがあります。

これらはタブで区切られています。FileA.txt
にはトランザクション レベルのレコードが含まれます。FileB.txt
には参照/ルックアップ「テーブル」が含まれます。

FileB.txt の「Company」の内容を FileA.txt の「Description」と一致させることで、FileB.txt の「Company」および「CATEGORY」という列を FileA.txt に追加したいと思います。

明確にするために、一致とマージは、FileA.txt の「説明」という列に含まれる文字列内に「会社」の内容が存在するかどうかに基づいて行う必要があります。
この点についてご支援いただければ幸いです。

ファイルA.txt

Date    Description Amount
1/15/2016   1231 HAMBURGER #1234 Albany NY 24186166001200699400511  -22.54
3/3/2016    EASTERN FRUIT CO S1 Trenton NJ  -110.93
2/26/2016   GUMPS* PAPER INC. 999-123-4560 CA   -9.99
2/16/2016   EASY BURGERS SUPPLIES 01/31 #000741643 PURCHASE FOOD S TRENTON NJ   -10.97
2/19/2016   FRANKFURTER Stamford CT -14.18
2/5/2016    CHECKCARD 0141FRANK'S GROCERIES Albany NY 24071056031987159327565   -87.92
3/11/2016   WIRED PENCIL & PAPER Sacramento NJ  -72.16
3/18/2016   UNDERWATER MAIL SRVC 654321 800-1234567 DC  -65
1/31/2016   VOYAGER REAL ESTATE CO . 415 DES:LEASE PYMNT INDN:123 Main St. CO ID:XXXXX999 ACH   -126.65
1/18/2016   CARD 0101 US BASKETWEAVING ASSOC 123-456-7890 TX 54692166432112345  -265
4/18/2016   CARD ACH #89 UNDERWATER MAIL SRVC 654321 800-1234567 DC 6787654320  -250

ファイルB.txt

Company CATEGORY
HAMBURGER   FOOD
FRANKFURTER FOOD
PAPER INC.  OFFICE
WIRED PENCIL & PAPER    OFFICE
FRANK'S GROCERIES   GROC
EASY BURGERS SUPPLIES   GROC
EASTERN FRUIT CO.   GROC
US BASKETWEAVING ASSOC  OFFICE
UNDERWATER MAIL SRVC    OFFICE
VOYAGER REAL ESTATE REAL ESTATE

答え1

シンプルな実装。awk が最適なツールかどうかはわかりません。

  awk -F '\t' '
    BEGIN {
        while(getline < "fileB.txt")
           fileB[$1]=$0
    }

    {
      matched=""
      for (company in fileB) 
      {    
        if ( $2 ~  company ) 
        {
            matched=fileB[company]
            break
        }
      } 
      if (matched)
        print $0 "\t" matched
      else
        print 

    }' fileA.txt

これは開始方法を示すためのもので、このスクリプトは改善できます。一致は入力がクリーンな場合にのみ信頼でき、そうでない場合は機能しません。大文字/小文字、複数のスペースで区切られた単語などに注意してください。行が複数の会社に一致する可能性がありますが、このスクリプトはそれを検出しません。その場合は、ブレークをカウンターに置き換えて、ループの後にテストする必要があります。

関連情報