首页 > 解决方案 > 需要使用 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

请帮我解决这个问题

标签: shellcsv

解决方案


如果您接受 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.csvcsv2.csv.


推荐阅读