仅使用 bash 脚本从 CSV 字段中删除逗号

仅使用 bash 脚本从 CSV 字段中删除逗号

我有一个 CSV 文件,我想编辑 ipAddress 列以删除逗号。基本上120.30.19, 119.234.76应该改为 120.30.19 119.234.76

这是我的数据:

Name,Age,Gender,id,Phone,Address,City,State,Country,IPAddress,OtherColumn1,OtherColumn2
John,25,Male,12,123,Main St,New York,NY,USA,120.30.19, 119.234.761,Value1,Value2

我希望它是:

Name,Age,Gender,id,Phone,Address,City,State,Country,IPAddress,OtherColumn1,OtherColumn2
John,25,Male,12,123,Main St,New York,NY,USA,120.30.19 119.234.761,Value1,Value2

我唯一想要更改的是 IP 地址。我得到了这个命令: sed 's/\(\([^,]*,\)\{9\}[^,]*\),/\1/g'data.csv 可以工作,但是它的作用是合并 IPAddress 和 OtherColumn1 所以我最终得到类似的东西:

Name,Age,Gender,id,Phone,Address,City,State,Country,IPAddressOtherColumn1,OtherColumn2
John,25,Male,12,123,Main St,New York,NY,USA,120.30.19 119.234.761,Value1,Value2

我知道这是一个简单的修复,但任何帮助将不胜感激,老实说,我不确定 sed 命令有什么问题以及为什么这样做。这是我第一次必须执行 shell 脚本或正则表达式,所以我的终端肯定有很多需要改进的地方。

谢谢!

答案1

您的“CSV”文件已损坏。您应该修复生成它的任何内容,以便它用双引号包含逗号字符的任何字段。然后使用perl(例如文本::CSV)或Python(例如数据集) 或者磨坊主使用它们 - sed 和 awk 对于简单的逗号分隔文件来说还可以,但对于带有包含逗号、换行符或其他有问题字符的带引号字段的实际 CSV 文件来说则不然。

但是,您的 IP 地址似乎是用逗号和空格分隔的。如果情况总是如此(并且没有其他字段以空格开头),那么您可以使用 sed 命令来定位它 - 例如:

sed -e 's/, / /g'

答案2

只需在你的模式之前添加1 !这样的

sed '1 ! s/\(\([^,]*,\)\{9\}[^,]*\),/\1/g'

这会跳过标题

输出

$ sed '1 ! s/\(\([^,]*,\)\{9\}[^,]*\),/\1/g' d
Name,Age,Gender,id,Phone,Address,City,State,Country,IPAddress,OtherColumn1,OtherColumn2
John,25,Male,12,123,Main St,New York,NY,USA,120.30.19 119.234.761,Value1,Value2

答案3

使用任何 awk:

$ awk 'BEGIN{FS=OFS=","} NF>12{$10=$10 $11; $11=$12; $12=$13; sub(/,[^,]*$/,"")} 1' file
Name,Age,Gender,id,Phone,Address,City,State,Country,IPAddress,OtherColumn1,OtherColumn2
John,25,Male,12,123,Main St,New York,NY,USA,120.30.19 119.234.761,Value1,Value2

或者如果您愿意:

$ awk 'BEGIN{FS=OFS=","} {print $1, $2, $3, $4, $5, $6, $7, $8, $9, $10 (NF>12 ? $11 : ""), $(NF-1), $NF}' file
Name,Age,Gender,id,Phone,Address,City,State,Country,IPAddress,OtherColumn1,OtherColumn2
John,25,Male,12,123,Main St,New York,NY,USA,120.30.19 119.234.761,Value1,Value2

相关内容