FileA.txtとFileB.txtという2つのテキストファイルがあります。
タブで区切られます。
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
これは、始める方法とスクリプトを改善する方法を示しています。入力がきれいな場合にのみマッチングが信頼でき、そうでなければマッチングは機能しません。大文字/小文字、複数のスペースで区切られた単語などを参照してください。 1行は複数の会社と一致するかもしれませんが、スクリプトはそれを検出しません。この場合、改行をカウンターに置き換えてから、ループポストテストで置き換える必要があります。