【问题标题】:Replace columns in .csv using other .csv columns使用其他 .csv 列替换 .csv 中的列
【发布时间】:2015-11-05 21:42:31
【问题描述】:

我有 2 个 15 000 行的 csv 文件,如下所示:

每日.csv

"CODE","BRAND","DESIGNER","SIZE","TYPE","GENDER","SET","DESCRIPTION","IMAGE","COST","WEIGHT","MSRP","UPC"
"M-1001","212","Caroline Her","1.7 oz","EDT Spray","Men","","text.","http://www.domain.com/products/Men/Final/M-1001large.jpg","31.08","1","57.00","8411061341704"
"M-1003","1881","Nino Cer","1.7 oz","EDT Spray","Men","","text.","http://www.domain.com/products/Men/Final/M-1003large.jpg","24.13","1","36.00","688575003642"
"M-1004","1881","Nino Cer","3.4 oz","EDT Spray","Men",""," text.","http://www.domain.com/products/Men/Final/M-1004large.jpg","37.51","1","50.00","688575003659"

GoodImages.csv

CODE,Images URL
M-1001,http://www.domain.com/overstock-images/M-1001arger.jpg
M-1004,http://www.domain.com/overstock-images/M-1004larger.jpg
W-C-4948,http://www.domain.com/overstock-images/W-C-4948larger.jpg

只有当两个字段 1 匹配时,我才需要将 Daily.csv 中的字段 9“图像”替换为 GoodImages.csv 中的字段 2“图像 URL”。

Output is desired as:

"CODE","BRAND","DESIGNER","SIZE","TYPE","GENDER","SET","DESCRIPTION","IMAGE","COST","WEIGHT","MSRP","UPC"
"M-1001","212","Caroline Her","1.7 oz","EDT Spray","Men","","text.","http://www.domain.com/overstock-images/M-1001larger.jpg","31.08","1","57.00","8411061341704"
"M-1003","1881","Nino Cer","1.7 oz","EDT Spray","Men","","text.","http://www.domain.com/overstock-images/M-1004larger.jpg","24.13","1","36.00","688575003642"
"M-1004","1881","Nino Cer","3.4 oz","EDT Spray","Men",""," text.","http://www.domain.com/products/Men/Final/M-1004large.jpg","37.51","1","50.00","688575003659"

如果可能,我想从 cron 作业中运行它。

CENTOS 6.7 x86_64 标准

谢谢

【问题讨论】:

  • 我看到“需要”和“喜欢”,但有问题吗?你被困在哪里了?
  • 我没有足够的知识来完成这项工作。如何做到这一点?
  • 这可以通过 python 字典和一些循环来完成。如果表在 mySQL 或 sqlite 数据库中,则另一种方法可以在数据库中使用单行 UPDATE TABLE 查询来完成。既不困难,也不是很有趣。获得“免费帮助”可能很棘手,因为大多数人喜欢帮助他人学习或至少解决有趣的问题。
  • 所需输出中“M-1003”和“M-1004”行中的 URL 是否正确?
  • Shell 是一种用于简单自动化的命令处理器,而不是用于复杂任务的编程语言。是时候切换到真正的编程语言了,比如 python、perl、java 等。

标签: bash csv awk grep ksh


【解决方案1】:
join -a 1 -o 1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.10,1.11,1.12,1.13,2.2,1.9 -t, <(sort -t, -k 1,1 Daily.csv) <(sed 's/[^,]*/"&"/g' GoodImages.csv | sort -t, -k 1,1) | sed 's/,,/,/'| cut -d , -f -13 | awk -F"," '{OFS = ","; print $1,$2,$3,$4,$5,$6,$7,$8,$13,$9,$10,$11,$12}'

输出:

"CODE","BRAND","DESIGNER","SIZE","TYPE","GENDER","SET","DESCRIPTION","图片 URL","COST","WEIGHT","MSRP","统一码” "M-1001","212","Caroline Her","1.7 oz","EDT Spray","男士","","text.","http://www.domain.com/overstock-图像/M-1001arger.jpg","31.08","1","57.00","8411061341704" "M-1003","1881","Nino Cer","1.7 oz","EDT Spray","男士","","text.","http://www.domain.com/products/男子/决赛/M-1003large.jpg","24.13","1","36.00","688575003642" "M-1004","1881","Nino Cer","3.4 oz","EDT Spray","Men","","text.","http://www.domain.com/overstock-图像/M-1004larger.jpg","37.51","1","50.00","688575003659"

【讨论】:

    【解决方案2】:

    awk可以轻松解决这个问题:

    $ awk 'NR==FNR{a["\""$1"\""]=$2;next}{if ($1 in a){$9=a[$1]}}1' FS=',' OFS=',' GoodImages.csv Daily.csv
    "CODE","BRAND","DESIGNER","SIZE","TYPE","GENDER","SET","DESCRIPTION",Images URL,"COST","WEIGHT","MSRP","UPC"
    "M-1001","212","Caroline Her","1.7 oz","EDT Spray","Men","","text.",http://www.domain.com/overstock-images/M-1001arger.jpg,"31.08","1","57.00","8411061341704"
    "M-1003","1881","Nino Cer","1.7 oz","EDT Spray","Men","","text.","http://www.domain.com/products/Men/Final/M-1003large.jpg","24.13","1","36.00","688575003642"
    "M-1004","1881","Nino Cer","3.4 oz","EDT Spray","Men",""," text.",http://www.domain.com/overstock-images/M-1004larger.jpg,"37.51","1","50.00","688575003659"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2015-08-02
      • 2018-11-29
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2014-03-05
      相关资源
      最近更新 更多