bash - 更新 Shell 中特定列的分隔符
问题描述
我有一个 CSV 文件,CSV 文件中的列数是 10。但是这个值中有一个包含“,”的列。我想将文件的分隔符更改为“|” 在包含“,”的列中没有更改数据
我有的文件
John Doe,19,England,3653,Manchester, England,Main Worker,20-05-1995
Bill Mark,19, Australia,3653,Main Street, People Two, Perth,Main Worker,20-05-1995
Mark Home,19,USA,3653, Redmond, Ground Town, Main Street, Virginia,Main Worker,20-05-1995
所需输出
John Doe|19|England|3653|Manchester, England|Part Time Worker|20-05-1995
Bill Mark|19|Australia|3653|Main Street, People Two, Perth|Main Worker,20-05-1995
Mark Home|19|USA|3653| Redmond, Ground Town, Main Street, Virginia|Main Worker|20-05-1995
我尝试了多种解决方案,但无法实现我想要的。我尝试了以下命令,它只更新前 4 列的分隔符。
sed 's/,/|/;s/,/|/;s/,/|/;s/,/|/' file
我正在寻找的方法是更新前 4 列和后 2 列的分隔符。通过这种方式,我可以让文件具有更新的分隔符,并且地址列对其没有影响。
解决方案
使用 sed (GNU sed) 4.7:
sed 's/, /\o0/g;s/,/|/g;s/\d0/, /g' file
文件中的字段分隔符是逗号,但某些字段中可以有逗号。
正如您在数据中看到的那样,字段中的逗号永远不会单独出现。
幸运的是,它后面总是有一个空格。
所以首先,将 ', ' 转换为 char NUL (\o0]。这个 char 永远不会出现在文本文件中。
之后,将所有逗号转换为 '|'
最后,恢复 ','
或者,使用 GNU Awk 5.1.0,API:3.0(GNU MPFR 4.1.0,GNU MP 6.2.1)
awk -F', ' 'BEGIN{OFS=FS}{for(i=1;i<=NF;i++)gsub(",","|",$i)}1' file
推荐阅读
- boost - CMake 的 find_package 仅包含标头库
- reactjs - 使用函数获取 API 数据并填充提供程序
- php - 如何创建包含上传图像的 Slack 消息?
- ios - 添加依赖后 Flutter 构建失败
- javascript - 为什么我的 var 为 null 并且代码不起作用
- c# - 从具有重复数据的 SQL 结果创建键值对
- c - 错误:编译 stdlib.h 时的未知类型名称“__float128”
- c++ - 仅使用 regex_search 返回第一个匹配项
- c# - 如何告诉编译器将 wwwroot 从一个项目复制到测试项目?
- laravel - 如何编写规则来验证多列的组合在 Laravel 6、PHP 中必须是唯一的?