繁体   English   中英

使用bash更改CSV中特定单元格的值

[英]Change the value of specific cell in CSV using bash

我想使用 bash 命令行更改 CSV 中特定单元格的值。

我有一个sellers.csv:

seller_id,seller_zip_code_prefix,seller_city,seller_state
3442f8959a84dea7ee197c632cb2df15,13023,campinas,SP
723a46b89fd5c3ed78ccdf039e33ac63,93310,novo hamburgo, rio grande do sul, brasil,RS

如您所见,第 3 行第 3 列 (seller_city) 违反了规则,因为它包含逗号。 这就是为什么 MySQL 会说“第 3 行包含的数据比输入列多”的原因。 我想把novo hamburgo, rio grande do sul, brasil改成novo hamburgo rio grande do sul brasil 我试过awk但它说我提供了错误的论据。

awk -v r=553 -v c=3 -v val="novo hamburgo - rio grande do sul - brasil" -F sellers.csv

awk: 选项需要一个参数 -- F

您不需要替换逗号,只需引用您的字段:

$ awk -F',' -v OFS='","' '{city=$0; sub(/([^,]*,){2}/,"",city); sub(/,[^,]*$/,"",city); print "\"" $1, $2, city, $NF "\""}' sellers.csv
"seller_id","seller_zip_code_prefix","seller_city","seller_state"
"3442f8959a84dea7ee197c632cb2df15","13023","campinas","SP"
"723a46b89fd5c3ed78ccdf039e33ac63","93310","novo hamburgo, rio grande do sul, brasil","RS"

但如果你真的不想这样做,你可以这样做:

$ awk 'BEGIN{FS=OFS=","} {city=$0; sub(/([^,]*,){2}/,"",city); sub(/,[^,]*$/,"",city); gsub(/ *, */," - ",city); print $1, $2, city, $NF}' sellers.csv
seller_id,seller_zip_code_prefix,seller_city,seller_state
3442f8959a84dea7ee197c632cb2df15,13023,campinas,SP
723a46b89fd5c3ed78ccdf039e33ac63,93310,novo hamburgo - rio grande do sul - brasil,RS

对于其他任何内容,请参阅使用 awk 有效解析 CSV 的最可靠方法是什么? .

最简单的选择是使用|生成 csv 文件| 而不是, 这个解决方案可以避免这个问题。

标准csv将字符串放在"引号中以避免内部, .

看到这个问题

这可能对你有用(GNU sed):

sed ':a;s/,/&/4;T;s// -/3;ta' file

如果当前行有四个,将第三个替换为-并重复直到失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM