shell 如何使用awk从行中提取字符串值并将其存储在变量中

dsekswqp  于 2023-06-30  发布在  Shell
关注(0)|答案(3)|浏览(116)

我尝试使用awk从行中提取股票值,并将其存储在变量stock中。然后,我尝试将其减少1,并更新该行中的相同位置。但是,更新过程似乎不能正常工作。
如果livros stock是71,当函数vender_livro()被调用时,livros.txt(存储数据)中的stock将变为70。

*livros的输出工作,显示右行。
***stock(stock=$(echo“$linha”)的输出|awk '{print $6}'))

返回正确的值。**

*减少库存工程的值(“stock=$(($stock - 1))”)。
问题

sed -i“s/$titulo[^ ]* $stock/$titulo $stock/”livros
未正确替换新值。
books.txt中的数据按以下顺序显示:
“作者标题描述类型页码股票价格”
功能:>

vender_livro() {
  echo "         -----------------"
  echo "         |   Sell Book    |"
  echo "         -----------------"
  read -p "Enter the title of the book to sell: " titulo

  if grep -q "$titulo" livros; then

    linha=$(grep "$titulo" livros)

    stock=$(echo "$linha" | awk '{print $6}')
    stock=$(($stock - 1))

    sed -i "s/$titulo[^ ]* $stock/$titulo $stock/" livros
    echo "Book sold successfully!"

  else
    echo "No book found in the database."
  fi

  echo
  read -p "Press Enter to continue" continue
  clear

}

hrirmatl

hrirmatl1#

修改前

stock=$(($stock - 1))

sed -i "s/$titulo[^ ]* $stock/$titulo $stock/" livros

修改后

sed -i -E "s/($titulo ([^ ]+ ){3})$stock/\1$((--stock))/" livros
bvjveswy

bvjveswy2#

awk -i inplace \                                        # change livros.txt in place 
    -v title=$titulo '                                  # passing titulo variable as title    
    BEGIN{
        out = "No book found in the database"           # set default output if title not found
    }
    $1==title {                                         # if title found for example in first column
                                                        # or '$0 ~ tilte' looking for title anywhere  
        $6-=1                                           # decrease col 6 (stock)
        out = "Book sold successfully!"                 # set success output 
    }1                                                  # print all rows
    END{
        print out                                       # print output 
    }
  ' livros.txt
unhi4e5o

unhi4e5o3#

“expr”不见了,所以当试图减少股票时,var $stock是一个字符串而不是int。
为了替换文件中的行,我将sed改为awk。

# Decrease stock by one
    newStock=$(expr "$stock" - 1)


    # Update the stock value in the line using awk

    awk -v title="$titulo" -v newStock="$newStock" '{ if ($2 == title) { $6 = newStock } print }' livros > livros_temp && mv livros_temp livros

相关问题