[英]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 的最可靠方法是什么? .
这可能对你有用(GNU sed):
sed ':a;s/,/&/4;T;s// -/3;ta' file
如果当前行有四个,
将第三个替换为-
并重复直到失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.