linux - 如何使用 bash 脚本从 csv 文件中读取特定整数?
问题描述
我已经编写了一个 bash 脚本(如下)来将数据添加到 csv 文件中,现在我想从这个 csv 文件中读取一个特定的整数。我该怎么做?
我使用了“cat”命令,但它打开了整个文件。但我不想要那个,我想打开,例如 ID 为 1 的客户。
另一方面,如何更新 csv 文件中的文件。例如,客户名称在 csv 文件中另存为“John”。通过使用更新功能,我想将他的名字更改为“Mattew Moniz”。我怎样才能做到这一点?
#!/bin/bash
#Final Project
while :
do
clear
echo " ITC 350-Open Source Software Project "
echo ""
echo " ==================================================="
echo " Customer Account Banking System "
echo " ==================================================="
echo -e "\e[31m1) Create a new customer account\e[0m" #red
echo -e "\e[32m2) Update account data\e[0m" #green
echo -e "\e[33m3) View and manage transaction\e[0m" #orange
echo -e "\e[34m4) Check customers account details\e[0m" #blue
echo "5) Delete customer's account"
echo -e "\e[36m6) Exit\e[0m" #gray
echo ""
echo ""
echo -e "\e[32mPlease choose an option:\e[1m" #ligh green
read usr_cmd
clear
case $usr_cmd in
1) echo "Enter customer name: "
read cus_name
while ! [[ $cus_name =~ ^-?[[:alpha:]]+$ || $cus_name =~ " " ]]; do
echo "Please enter a valid name"
read cus_name
done
echo "Enter customer DOB: "
read cus_dob
echo "Enter customer national ID number: "
read cus_national_num
while ! [[ $cus_national_num =~ ^-?[[:digit:]]+$ ]]; do
echo "Please enter a valid customer national ID number "
read cus_national_num
done
echo "Enter customer email address: "
read cus_email
echo "Enter cutomer city: "
read cus_city
while ! [[ $cus_city =~ ^-?[[:alpha:]]+$ || $cus_city =~ " " ]]; do
echo "Please enter a valid city"
read cus_city
done
echo "Enter customer country : "
read cus_country
while ! [[ $cus_country =~ ^-?[[:alpha:]]+$ || $cus_country =~ " " ]]; do
echo "Please enter a valid country "
read cus_country
done
echo "Enter contact number: "
read cus_phone_num
while ! [[ $cus_phone_num =~ ^-?[[:digit:]]+$ ]]; do
echo "Please enter a valid customer contact number "
read cus_phone_num
done
echo "Enter type of the account (Saving/Current): "
read cus_account_type
echo "Enter first deposit amount : "
read cus_first_deposit
while ! [[ $cus_first_deposit =~ ^-?[[:digit:]]+$ ]]; do
echo "Please enter a valid customer first deposit amount "
read cus_first_deposit
done
;;
# For this part I must write the code to generate a unique customer reg. number automatically
2) echo "Enter the customer registration number to update account data: "
read cus_reg_num
echo "Enter customer name: "
read cus_name
while ! [[ $cus_name =~ ^-?[[:alpha:]]+$ || $cus_name =~ " " ]]; do
echo "Please enter a valid name"
read cus_name
done
echo "Enter customer DOB: "
read cus_dob
echo "Enter customer national ID number: "
read cus_national_num
while ! [[ $cus_national_num =~ ^-?[[:digit:]]+$ ]]; do
echo "Please enter a valid customer national ID number "
read cus_national_num
done
echo "Enter customer email address: "
read cus_email
echo "Enter customer city: "
read cus_city
while ! [[ $cus_city =~ ^-?[[:alpha:]]+$ || $cus_city =~ " " ]]; do
echo "Please enter a valid city"
read cus_city
done
echo "Enter customer country: "
read cus_country
while ! [[ $cus_country =~ ^-?[[:alpha:]]+$ || $cus_country =~ " " ]]; do
echo "Please enter a valid country "
read cus_country
done
echo "Enter customer contact number: "
read cus_phone_num
while ! [[ $cus_phone_num =~ ^-?[[:digit:]]+$ ]]; do
echo "Please enter a valid customer contact number "
read cus_phone_num
done
echo "Enter type of the account (Saving/Current): "
read cus_account_type
while ! [[ $cus_country =~ ^-?[[:alpha:]]+$ || $cus_country =~ " " ]]; do
echo "Please enter a valid account type "
read cus_country
done
echo "Enter first deposit amount: "
read cus_first_deposit
while ! [[ $cus_phone_num =~ ^-?[[:digit:]]+$ ]]; do
echo "Please enter a valid customer first depsit amount: "
read cus_phone_num
done
;;
#I must write the code to bring changes to the customer's money from csv file
3) echo "Which operation would you like to process with: "
echo "1) Deposit"
read cus_deposit_to_account
echo "2) Withdraw"
read cus_withdraw
;;
#I must write the code to get the data from FINAL_PROJECT.cvs file and display it
4) echo "Enter the customer's registration number to view details: "
read view_cus_reg_num
;;
#I must write the code to delete the customer from FINAL_PROJECT.csv
5) echo "Enter the customer's registration number to delete: "
read cus_reg_num
;;
6)break;;
*) echo "Invalid option";;
esac
echo "Press 6 to quit, anything else to continue: "
read confirm_exit
if [ $confirm_exit -eq 6 ]
then break
fi
done
echo "Customer Name", "Customer DOB", "Customer National ID Number", "Customer Email Address", "Customer City", "Customer Country", "Customer Contact Number", "Customer Account Type", "Customer First Deposit Amount" >> FINAL_PROJECT.csv
echo "$cus_name", "$cus_dob", "$cus_national_num", "$cus_email", "$cus_city", "$cus_country", "$cus_phone_num", "$cus_account_type", "$cus_first_deposit" >> FINAL_PROJECT.csv
#awk '!x[$1]++ && ! /^[[:blank:]]*$/' OSSGrades.csv
grep . FINAL_PROJECT.csv | awk '!a[$1]++' >> FINAL_PROJECT.csv
解决方案
要在第三列中查找 id 1,您可以使用grep
:
grep '^\([^,]*, \)\{2\}1,' file.csv
^
匹配行首;[^,]
匹配除逗号以外的任何字符;*
表示零次或多次,因此[^,]*
匹配零个或多个非逗号;\(...\)
此处仅用于对“列”进行分组;\{2\}
表示前一个元素(上面提到的组)必须重复两次,即 id 前面有两列。
请注意,这只适用于简单的 CSV 文件。对于真实的,可以在单元格内包含引号或转义的逗号甚至换行符,您将需要一种真正的编程语言而不是 shell。
推荐阅读
- html - 在页面底部粘贴页脚
- api - TeamCity - 如何通过 REST API 取消多个构建
- python - 如何找到输入中实体与数据库实体之间的相似性
- .net - CORS 不允许起源于 .net
- sql-server - 如何在 SQL 查询中使用 IP 地址而不是服务器名称
- javascript - 在将 html 动态附加到正文之前加载 CSS
- php - 只允许每天在 mysql 表中插入一次
- c# - 如何修复 Autofac - 需要装配资格(我的类型。我的装配)
- c# - 如何运行获取数据(10ms)、绘制图表(10ms)和保存数据(10ms)同步的 3 个任务?
- r - 按钮 csv/excel 不下载文件,而是打开一个空白页面