Unix - Awk - 符合和合併部分相符的兩個檔案(在字串內)

Unix - Awk - 符合和合併部分相符的兩個檔案(在字串內)

我有兩個文字檔案:FileA.txt 和 FileB.txt。

它們是製表符分隔的。
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

這是向您展示如何開始,該腳本可以改進。只有輸入乾淨時匹配才是可靠的,否則匹配不起作用。注意大小寫,單字之間由多個空格分隔,...一行可能會匹配多個公司,該腳本不會檢測到它,在這種情況下,您必須將換行符替換為計數器然後在循環後測試。

相關內容