Unix - Awk - 部分的に一致する2つのファイルを一致させてマージします(文字列内)。

Unix - Awk - 部分的に一致する2つのファイルを一致させてマージします(文字列内)。

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

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

FileB.txtの「会社」コンテンツをFileA.txtの「説明」と一致させて、FileB.txtの「会社」と「カテゴリ」という列をFileA.txtに追加したいと思います。

明確にするために、一致とマージは、FileA.txtの「Description」列に含まれる文字列に「Company」コンテンツがあるかどうかに基づいている必要があります。
これにご協力いただきありがとうございます。

ファイル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

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

おすすめ記事