【问题标题】:How to replace a comma delimiter in string in csv file Unix - MAC OS如何在 csv 文件 Unix 中替换字符串中的逗号分隔符 - MAC OS
【发布时间】:2018-08-06 08:16:26
【问题描述】:

我有一个带有逗号分隔符的 CSV 文件,需要在字符串中删除此分隔符以操作数据。

文件如下:
Col1, Col2, Col3, Col4
100, 08 科学, "xx, yy, ww", 美国
110、06文化,“abc, ww”,美国
115, 05 地质学,“地质学”,加利福尼亚州

我需要扫描字符串以替换分隔符,但不知道如何继续。 我试过 sed 's/","/" "/g' (使用 Mac OS 10.10)

因此,当我尝试保留某些列时,我无法达到预期的结果: 剪切 -d , -f 2,3 myfile.csv > newfile.csv

我得到了:
08科学,“xx
06文化,“abc
05地质学,《地质学》

代替
08科学,“xx、yy、ww”
06文化、《abc、ww》
05地质学,《地质学》

有什么帮助吗?

【问题讨论】:

  • 麻烦的字段总是已知的 - 我的意思是,你能在一开始就说这次是字段 3 吗?是只有一个麻烦的字段,还是一行可以有两个双引号的字段?考虑将awk 添加到您的标签中,您会更快地得到答案...
  • @Mark Setchell 要回答您的问题,是的,问题仅出现在有文本的字段 3 上。
  • @Sundeep 谢谢,我去看看

标签: macos csv unix awk delimiter


【解决方案1】:

当你想要第二列和第三列时,使用

sed 's/[^,]*,//;s/,[^,]*//' inputfile
# or
sed 's/[^,]*,\(.*\),.*/\1/' inputfile
# or removing space before col3
sed 's/[^,]*, *\(.*\),.*/\1/' inputfile

【讨论】:

  • 我尝试了您的脚本,但第一列已被挤压。我不知道为什么。因此分隔符仍在字符串中。您的脚本是否只是进行扫描以从第一个引号到下一个引号将整个字符串作为一列读取?
  • 也许你的文件中有\r。您可以使用 cat -v inputfile 查找 ^M 并使用 sed 's/\r//' inputfile 删除它们(选项 -i 或重定向到其他文件)。
  • 我已经这样做了,但无法删除 CR。我猜是因为macos。将在 Windows 上尝试。
【解决方案2】:

假设您的第三列将包含 " "

$ awk -F"," -v OFS="," '{match($0,/\".*\"/,a); print $2 OFS a[0]}' file
 08 sciences,"xx, yy, ww"
 06 culture,"abc, ww"
 05 geology,"geology"

【讨论】:

    【解决方案3】:

    我想你想用双引号内字段中的空格替换逗号。

    如果是这样,请使用awk 并告诉它字段用双引号分隔,并且您想将字段 2 中的逗号替换为空格,如下所示:

    awk -F'"' '{gsub(/,/," ",$2)}1' OFS='"' yourFile
    

    样本输出

    100, 08 sciences, "xx  yy  ww", US
    110, 06 culture, "abc  ww", US
    115, 05 geology, "geology", CA
    

    【讨论】:

      【解决方案4】:
      awk 'NR>1{gsub(/^.....|....$/,"");print}' file
      
      08 sciences, "xx, yy, ww"
      06 culture, "abc, ww"
      05 geology, "geology"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 2013-09-20
        • 2019-03-24
        • 1970-01-01
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多