【问题标题】:How to convert CSV file in bash?如何在 bash 中转换 CSV 文件?
【发布时间】:2012-09-06 08:16:16
【问题描述】:

我有一个文件,其中每一行都是逗号分隔值的列表。例如,

1, a, b, c, d, e
2、x、y、z

现在我想将其转换为bash,如下所示:

1个
1个
1摄氏度
1天
1e
2×
2年
2z

如何使用shell (bash) 脚本做到这一点?

【问题讨论】:

    标签: bash shell csv


    【解决方案1】:
    awk -F, '{for(i=2;i<=NF;i++)print $1,$i}' temp
    

    测试如下:

    > cat temp
    1, a, b, c, d, e
    2, x, y, z
    > awk -F, '{for(i=2;i<=NF;i++)print $1,$i}' temp
    1  a
    1  b
    1  c
    1  d
    1  e
    2  x
    2  y
    2  z
    

    【讨论】:

      【解决方案2】:

      您可以将行拆分为标记并将它们放入数组中。数组的第一个元素将具有数字,在您的情况下它是 1 或 2,依此类推。可能是这样的:

      while read line
      do
          arrIN=(${line//,/ })
      
      ## make a loop and echo them
      ## arrIN[0] will have the initial number
      
      done < $file
      
      # $file is the input file you are reading
      

      【讨论】:

        【解决方案3】:

        我知道您需要一个 shell 脚本,但它必须是 bash 吗?例如我通常会使用更高级别的脚本语言和 CSV 库。例如PerlText::CSV

        【讨论】:

        • 我不认为任何 CSV 库(甚至对于非脚本语言,如 Java)都无法解决这个用例开箱即用的问题,因为这是处理 CSV 数据的一种奇怪方式 - - 而且该数据甚至不是真正的 CSV。作为旁注,从您的回答中可以理解 Perl 是一种“shell 脚本”,但事实并非如此。
        • 投反对票的原因是什么?在这里建议使用更高级别的脚本语言和面向 CSV 的库似乎并不合理
        • 那么上面的“甚至不是真正的 CSV”是怎么回事?
        • 我没有否决你的回答;我不认为这很糟糕,虽然我觉得它不是特别有用。
        • 至于“真正的 CSV”问题,虽然 CSV 没有真正的标准,但 text/csv mime 类型的 RFC-4180 声明“每一行应该在整个文件中包含相同数量的字段"(应明确列出空字段,如:a,b,,,);某些库在解析 CSV 输入时可能会施加此先决条件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-23
        • 2021-07-22
        • 2011-05-16
        • 2017-11-30
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多