修改文件

时间:2017-08-30 18:01:56

标签: string bash awk sed

我期待着修复数据库的格式并允许用户输入他想在数据库中修改的确切字段并使用sed修改所述数量。进一步解释这个困境。

假设我有一个名为.cart的隐藏文件,其中包含

0011 Fish Tuna Eyeballs 2 80 160 0023 Fugu Fish Cream 3 360 1080 0035 Human Hair 5 2000 10000 0033 Stargazey Fish Pie 7 270 1890

第一个字段是产品ID,第二个字段是名称,第三个是数量,第四个是原始价格,第五个是总价格

第一个问题:我在格式化方面遇到了麻烦。所有5列都与\ t作为分隔符粘贴在一起。如果您注意到第2行和第3行的错位,则由于项目名称。我想解决这个问题,但我不知道从哪里开始。缩短项目名称不是一种可能的选择。 (我在这里遇到问题可能是因为我无法格式化粘贴的物品?)

第二个问题:我想允许用户输入选择他们想要修改的项目我可以通过

轻松完成

read -number cat .cart | grep $number > .modifyme

然后给我们一个名为.modify me的隐藏文件,我们将处理第3个问题。

第3个问题:通过再次允许用户输入来确定它的更改内容来修改它的数量(这是第3个字段)。

现在我们已经.modifyme并假设第二个问题中的用户输入是0023,这使我们.modifyme的内容为:

0023 Fugu Fish Cream 3 360 1080

我想再次允许用户使用他们输入的输入修改数量(第3个字段)。

为了解决上述3个问题,我对你可能提出的任何建议持开放态度。这里重要的是允许用户通过产品ID(第一个字段)输入他们想要修改的项目并更改其数量(第三个字段),然后将其乘以原始价格(第四个字段)以获得总数价格(第5场)。

非常感谢你!非常感谢!

1 个答案:

答案 0 :(得分:2)

我不确定你为什么反对制表符分隔文件。这似乎非常适合这种用法。

尽管如此,这是一个快速的3行脚本,它将从用户获取产品ID,从用户获取数量,并使用awk更新文件(第3和第5列):

#!/bin/bash

#get the product id
read -p "Product ID: " productid

#get the new price
read -p "Qty: " qty

#update the record in the file
awk -F"\t" -v "prodid=$productid" -v "qty=$qty" 'BEGIN{OFS=FS} $1==prodid { $3=qty; $5=( qty * $4 ) }{print $0}' .cart > .cart.tmp && mv -f .cart.tmp .cart

这应该给从这里建立足够的方向。大毛茸茸的部分是:

  1. Shell变量通过awk -v标志传递给awk。
  2. 我们正在使用/t旗帜上的标签-F分隔符将文件拆分为字段
  3. 我们指定我们希望输出字段分隔为tab OFS=FS
  4. 我们正在测试第一个字段,看看它是否是用户$1 == prodid输入的产品ID
  5. 最后,我们将awk输出重定向回tmp文件,然后将tmp文件移到现有.cart文件的顶部。