Unix - Awk - Combinando e mesclando dois arquivos em uma correspondência parcial (dentro da sequência de caracteres)

0

Eu tenho dois arquivos de texto: FileA.txt e FileB.txt.

Eles são delimitados por tabulações.
FileA.txt contém registros no nível da transação. FileB.txt contém uma "tabela" de referência / consulta.

Eu gostaria de acrescentar colunas chamadas "Company" e "CATEGORY" em FileB.txt para FileA.txt, combinando o conteúdo de "Company" em FileB.txt para "Description" em FileA.txt.

Para esclarecer, combine & A mesclagem deve ser feita com base no fato de o conteúdo de "Company" existir ou não dentro da cadeia de caracteres contida na coluna "Descrição" em FileA.txt.
Qualquer ajuda sobre isso seria apreciada.

FileA.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

FileB.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
    
por Mark Chikka 11.04.2017 / 21:56

1 resposta

0

Implementação simples. Não tenho certeza se o awk é a melhor ferramenta.

  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

Isto é para mostrar-lhe como começar, esse script pode ser melhorado. A correspondência é confiável somente se a entrada estiver limpa, caso contrário não funcionará. Cuidado com maiúsculas / minúsculas, palavras separadas por mais de um espaço, ... É possível que uma linha corresponda a mais de uma empresa, esse script não a detectará, nesse caso você teria que substituir a quebra por um contador e depois testar após o loop.

    
por 11.04.2017 / 23:45