2017-09-04 48 views
0

更新一個文件,輸入假設我有一個文件FirstDB.txt和它的填充。隨着格式 產品編號:產品名稱:產品數量:價格:DateRegistered從另一個文件

例如: cat FirstDB.txt

0001:Fried Tarantula:15:100:2017-08-27 
0002:Wasp Crackers:18:25:2017-08-27 
0003:Century Egg:19:50:2017-08-27 
0004:Haggis Flesh:20:90:2017-08-27 
0005:Balut (Egg):85:15:2017-08-27 

然後我有一個是由用戶名爲.cart生成的文件,它的人口以及與格式 產品編號產品數量IndividualPrice TotalPrice

cat .cart

0001 Fried Tarantula  5 100  500 
0003 Century Egg   7 50  350 
0005 Balut (Egg)   6 15  90 

我想更新什麼用戶購買或選擇的FirstDB.txt產品質量。考慮到兩個文件,我有以上,我想以後發生什麼事是這樣的輸出:

cat FirstDB.txt

0001:Fried Tarantula:10:100:2017-08-27 
0002:Wasp Crackers:18:25:2017-08-27 
0003:Century Egg:12:50:2017-08-27 
0004:Haggis Flesh:20:90:2017-08-27 
0005:Balut (Egg):79:15:2017-08-27 

我只有切割.cart第一列的概念,並使用grep $(cat .cart)得到線我需要再切的.cart第三列,以獲得數量則subract到FirstDB.txt第三列但是好像我無法得到我想要的輸出。我也想在FirstDB.txt上使用sed -i,但還沒有嘗試過。任何幫助?非常感謝!

+0

您只能使用'sed'?系統上沒有其他語言? – webdeb

+0

不是真的!只要可以在bash shell中完成,任何事情都會發生。我不使用awk,因爲我還沒有真正學到或掌握那一點。所以總結我們可以使用任何東西:) –

+0

這是一項任務嗎?我發現你很難使用像sqlite這樣的工具來解決這個問題。看看SQLite。它可以非常有效地做到這一點。這是一個選擇嗎? – NinjaGaiden

回答

1

sed的是簡單地做S /老/新/,僅此而已。你不是簡單地做着/舊/新/所以你不應該考慮使用sed。只要使用awk,即使您現在必須學習它...

$ cat tst.awk 
NR==FNR { a[$1] = $(NF-2); next } # save a["0001"]=5, etc from cart 
FNR==1 { FS=OFS=":"; $0=$0 }  # split FirstDB by ":"s instead of spaces 
{ $3 -= a[$1]; print }   # when $1=="0001" set $3 to $3-a["0001"] 

$ awk -f tst.awk cart FirstDB.txt 
0001:Fried Tarantula:10:100:2017-08-27 
0002:Wasp Crackers:18:25:2017-08-27 
0003:Century Egg:12:50:2017-08-27 
0004:Haggis Flesh:20:90:2017-08-27 
0005:Balut (Egg):79:15:2017-08-27 
+0

謝謝埃德!我一直在研究awk一段時間,而我仍然試圖去解決這個問題。你介意打破'tst.awk'的工作原理嗎?謝謝! –

+0

不客氣。好的,我添加了評論。 –