【问题标题】:Convert a combination of string and list to a csv file将字符串和列表的组合转换为 csv 文件
【发布时间】:2018-07-20 16:00:33
【问题描述】:

我有一个逗号分隔的文件,其中包含字符串和列表的组合,看起来像这样

24.33,-30.59,42542,['2.4', '3.6', '4.4', '5.8', '6.6', '7.2','9.4', '9.4', '9.8']
24.33,-30.60,25512,['1.4', '2.6', '2.8', '3.8', '4.6', '5.2','7.4', '8', '9']

我想要这样的东西

24.33,-30.59,42542,2.4,3.6,4.4,5.8,6.6,7.2,9.4,9.4,9.8
24.33,-30.60,25512,1.4,2.6,2.8,3.8,4.6,5.2,7.4,8,9

什么是最好和最简单的方法来做到这一点

【问题讨论】:

  • 请添加您尝试过的内容..从给定的示例中,看起来您可以简单地删除所有空格、引号和方括号..tr 将是完成该任务的好工具..跨度>
  • 嗨,你可以试试awk:awk -F '[,[]+' -v OFS=',' -v RS=']\n' '{$1=$1;} 1'
  • @Gioconda 抛开其他一切(例如 [,[] 不起作用 - 你的意思是 [],]),这将需要 GNU awk 用于多字符 RS,所以你应该说明这一点。

标签: linux csv unix awk formatting


【解决方案1】:

单行上的简单替换是 sed 存在的工作:

$ sed 's/[^0-9,.-]//g' file
24.33,-30.59,42542,2.4,3.6,4.4,5.8,6.6,7.2,9.4,9.4,9.8
24.33,-30.60,25512,1.4,2.6,2.8,3.8,4.6,5.2,7.4,8,9

但您也可以使用 tr:

$ tr -cd '0-9,.\n-' < file
24.33,-30.59,42542,2.4,3.6,4.4,5.8,6.6,7.2,9.4,9.4,9.8
24.33,-30.60,25512,1.4,2.6,2.8,3.8,4.6,5.2,7.4,8,9

如果你坚持使用 awk,那就是:

$ awk '{gsub(/[^0-9,.-]/,"")}1' file
24.33,-30.59,42542,2.4,3.6,4.4,5.8,6.6,7.2,9.4,9.4,9.8
24.33,-30.60,25512,1.4,2.6,2.8,3.8,4.6,5.2,7.4,8,9

【讨论】:

    【解决方案2】:

    请您尝试关注一下。

    awk '{gsub(/\[|\]/,"");gsub(/\047/,"");gsub(/, /,",")} 1'  Input_file
    

    或者更准确地说(从上面的代码中再减少一个gsub):

    awk '{gsub(/\[|\]|\047/,"");gsub(/, /,",")} 1'  Input_file
    

    解释:在这里也添加解释。

    awk '
    {
      gsub(/\[|\]|\047/,"") ##globally substituting [, ] and single dash with NULL in current line.
      gsub(/, /,",")        ##globally substituting comma with space with only comma in current line.  
    }
    1                       ##Mentioning 1 here to print the current line
    '  Input_file           ##Mentioning Input_file name here.
    

    【讨论】:

      猜你喜欢
      • 2018-08-04
      • 2020-01-03
      • 2014-06-23
      • 1970-01-01
      • 2013-05-05
      • 2017-11-07
      • 2016-06-24
      • 2010-12-25
      • 1970-01-01
      相关资源
      最近更新 更多