FileA.txt と FileB.txt という 2 つのテキスト ファイルがあります。
これらはタブで区切られています。FileA.txt
にはトランザクション レベルのレコードが含まれます。FileB.txt
には参照/ルックアップ「テーブル」が含まれます。
FileB.txt の「Company」の内容を FileA.txt の「Description」と一致させることで、FileB.txt の「Company」および「CATEGORY」という列を FileA.txt に追加したいと思います。
明確にするために、一致とマージは、FileA.txt の「説明」という列に含まれる文字列内に「会社」の内容が存在するかどうかに基づいて行う必要があります。
この点についてご支援いただければ幸いです。
ファイル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
これは開始方法を示すためのもので、このスクリプトは改善できます。一致は入力がクリーンな場合にのみ信頼でき、そうでない場合は機能しません。大文字/小文字、複数のスペースで区切られた単語などに注意してください。行が複数の会社に一致する可能性がありますが、このスクリプトはそれを検出しません。その場合は、ブレークをカウンターに置き換えて、ループの後にテストする必要があります。