shell - 需要使用 Shell 根据 csv 中的特定列检查和更新行
问题描述
我需要根据列更改 csv 的值,
csv1:
Account User login status
guh guhan 1 upload
nav Naveen 2 complete
csv2:
Account User login status
guh guhan 1 complete
nav Naveen 2 complete
输出 csv:
guh guhan 1 complete
nav Naveen 2 complete
需要从该行的第二行检查,因为第一行是 csv 的标题。
while IFS="," read Account User login status
if [ $status in csv1 = $status in csv2 ]
dont change
if [$ status in csv1 != $staus in csv2 ]
change the status value
请帮我解决这个问题
解决方案
如果您接受 Python 中的解决方案,您可以:
给定csv1.csv
为
Account,User,login,status
guh,guhan,1,upload
nav,Naveen,2,complete
并且csv2.csv
作为
Account,User,login,status
guh,guhan,1,complete
nav,Naveen,2,complete
您可以运行以下脚本output.py
:
#!/usr/bin/env python3
# Update status information from csv1 according to csv2
import csv
with open('csv1.csv') as cf:
reader = csv.DictReader(cf)
fieldnames = reader.fieldnames
rows1 = [ r for r in reader ]
with open('csv2.csv') as cf:
rows2 = [ r for r in csv.DictReader(cf) ]
KEY_FIELDS = ['Account','User','login']
FIELD_TO_UPDATE = 'status'
OVERWRITE_STATUS = 'complete'
with open('output.csv','w') as cf:
writer = csv.DictWriter(cf, fieldnames=fieldnames)
writer.writeheader()
for r1 in rows1:
r_new = r1
for r2 in rows2:
if all([ r1[f] == r2[f] for f in KEY_FIELDS ]):
if r2[FIELD_TO_UPDATE] == OVERWRITE_STATUS:
r_new[FIELD_TO_UPDATE] = OVERWRITE_STATUS
writer.writerow(r_new)
这会给你一个文件output.py
:
Account,User,login,status
guh,guhan,1,complete
nav,Naveen,2,complete
警告:此脚本非常基本,不能扩展到大文件csv1.csv
和csv2.csv
.
推荐阅读
- node.js - 如何让 this.setState 在 React-Native 中工作
- r-markdown - 如何在 rmarkdown 中嵌入 highcharter 以共享(不是循环)
- ios - iOS Swift Firebase在应用程序启动时检查用户不起作用
- unity3d - 有没有办法知道什么时候没有人用 Agora (Unity) 广播
- selenium - 如何在 qaf 中使用 edgeDriver
- c++ - C++强制实现方法?
- javascript - 单击时更改背景颜色(使用 javascript 中的地图功能)
- excel - 设置用户表单边框颜色属性
- html - 在 HTML 页面中显示经过身份验证的用户
- css - :active 保持动画即使我们释放鼠标按钮