Unix - Awk - 부분 일치에서 두 파일 일치 및 병합(문자열 내)

Unix - Awk - 부분 일치에서 두 파일 일치 및 병합(문자열 내)

FileA.txt와 FileB.txt라는 두 개의 텍스트 파일이 있습니다.

탭으로 구분됩니다.
FileA.txt에는 트랜잭션 수준 레코드가 포함되어 있습니다.
FileB.txt에는 참조/조회 "테이블"이 포함되어 있습니다.

FileB.txt의 "Company" 내용을 FileA.txt의 "Description"과 일치시켜 FileB.txt의 "Company" 및 "CATEGORY" 열을 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

이는 시작 방법을 보여주기 위한 것이며 해당 스크립트를 개선할 수 있습니다. 일치는 입력이 깨끗한 경우에만 신뢰할 수 있으며, 그렇지 않으면 작동하지 않습니다. 대문자/소문자, 두 개 이상의 공백으로 구분된 단어에 주의하십시오. 한 줄이 두 개 이상의 회사와 일치할 수 있으며, 해당 스크립트는 이를 감지하지 못합니다. 이 경우 구분선을 다음으로 바꿔야 합니다. 카운터 다음 루프 후에 테스트합니다.

관련 정보