在Ubuntu中,当其他列值的引号内有逗号时,将CSV中的一个列值复制到另一个列



输入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内置变量–FSOFS、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"

相关内容

  • 没有找到相关文章

最新更新