使用来自其他文件的输入更新一个文件

时间:2017-09-04 13:41:49

标签: string bash awk sed

假设我有文件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的用户生成的文件,并且它的格式也已填充 productID productName Quantity 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的第三列以获取数量然后减去它到FirstDB.txt的第三列,但似乎我无法得到我想要的输出。我也在考虑在sed -i上使用FirstDB.txt但尚未尝试过。有帮助吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

sed只是简单地做s / old / new /,就是这样。你不是简单地做s / old / new /所以你不应该考虑使用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