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

이는 시작하는 방법과 스크립트를 개선할 수 있는 방법을 보여줍니다. 입력이 깨끗한 경우에만 일치가 신뢰할 수 있으며, 그렇지 않으면 일치가 작동하지 않습니다. 대문자/소문자, 여러 공백으로 구분된 단어 등을 참고하세요. 한 줄이 여러 회사와 일치할 수 있지만 스크립트는 이를 감지하지 못합니다. 이 경우 줄 바꿈을 카운터로 바꾼 다음 루프 포스트 테스트에서 바꿔야 합니다.

관련 정보