Unix - Awk - Сопоставление и объединение двух файлов при частичном совпадении (внутри строки символов)

Unix - Awk - Сопоставление и объединение двух файлов при частичном совпадении (внутри строки символов)

У меня есть два текстовых файла: FileA.txt и FileB.txt.

Они разделены табуляцией.
Файл FileA.txt содержит записи уровня транзакции.
Файл FileB.txt содержит справочную/подстановочную «таблицу».

Я хотел бы добавить столбцы «Компания» и «КАТЕГОРИЯ» из FileB.txt в FileA.txt, сопоставив содержимое «Компания» в FileB.txt с «Описанием» в FileA.txt.

Для ясности, сопоставление и слияние должны основываться на том, существует ли содержимое для "Company" в строке символов, содержащейся в столбце "Description" в 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

Это для того, чтобы показать вам, как начать, этот скрипт можно улучшить. Сопоставление надежно только если входные данные чистые, в противном случае это не сработает. будьте осторожны с заглавными/строчными буквами, словами, разделенными более чем одним пробелом, ... Возможно, что строка будет соответствовать более чем одной компании, этот скрипт не обнаружит этого, в этом случае вам придется заменить разрыв счетчиком, а затем выполнить проверку после цикла.

Связанный контент