首页 > 解决方案 > 更新 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 列的分隔符。通过这种方式,我可以让文件具有更新的分隔符,并且地址列对其没有影响。

标签: bashshelldelimiter

解决方案


使用 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

推荐阅读