输入CSV样本
name,mobile,address,usermobile
Testone, 111111111, "test,address"
Testtwo, 2222222222, "Testtwo,address"
现在我想将mobile列的值复制到usermobile列中。但地址列中有一个逗号(,(,尽管它在双引号内,但我没有得到预期的输出
预期输出
name,mobile,address,usermobile
Testone, 111111111, "test,address",111111111
Testtwo, 2222222222, "Testtwo,address",2222222222
我已经尝试过使用以下命令,但没有得到预期的输出
awk 'BEGIN{FPAT = "([^,]+)|("[^"]+")" && FS=OFS=","} (NR>1) && ($2!=""){$5=$2} 1' test.csv > output.csv
使用GNU awk:
awk 'NR>1{$(NF+1)=$2} {print}' FS=', ' OFS=', ' file
输出:
姓名,手机,地址,用户手机Testone,111111111,"测试,地址",1111111111测试二,2222222222,"测试二,地址",2222222232
参见:8个强大的Awk内置变量–FS,OFS、RS、ORS、NR
请您尝试以下操作。我已经在移动设备上写了这篇文章,所以无法测试它应该在GNUawk
中工作
awk -v FPAT='[^,]*|"[^"]+"' -v OFS=", " 'FNR==1{print;next} {print $0,$2}' Input_file
使用awk
,可以在开头设置一个与FS和OFS", "
相同的更清晰的代码(逗号后跟空格(,然后在末尾打印您需要的内容:在这种情况下为$2
。
awk -v FS=", " -v OFS=", " 'NF==1 {print}; NF>1 {print $1, $2, $3, $2}' file
name,mobile,address,usermobile
Testone, 111111111, "test,address", 111111111
Testtwo, 2222222222, "Testtwo,address", 2222222222
使用Ruby这样一个更现代、更强大的工具会更容易,它可以做awk能做的一切,也可以做awk不能做的一切。
$ cat ... | ruby -ne $'require "csv"; print $_.chop() + "," + CSV.parse($_)[0][1] + "n" if not $_.match(/name,mobile/)'
Testone,111111111,"test, address",111111111
Testtwo,2222222222,"Testtwo, address",2222222222
注意:根据标准,CSV文件不应在字段之间包含空格,即输入文件应如下所示:
Testone,111111111,"test,address"
Testtwo,2222222222,"Testtwo,address"