【问题标题】:Convert .txt to .csv in shell在 shell 中将 .txt 转换为 .csv
【发布时间】:2016-09-21 05:05:19
【问题描述】:

我有一个文本文件:

ifile.txt
1  4    22.0  3.3 2.3
2  2    34.1  5.4 2.3
3  2    33.0 34.0 2.3
4 12     3.0 43.0 4.4

我想将其转换为 csv 文件:

ofile.txt
ID,No,A,B,C
1,4,22.0,3.3,2.3
2,2,34.1,5.4,2.3
3,2,33.0,34.0,2.3
4,12,3.0,43.0,4.4

我正在尝试这个,但没有得到结果。

(echo "ID,No,A,B,C" ; cat ifile.txt) | sed 's/<space>/<comma>/g' > ofile.csv

【问题讨论】:

  • ifile.txt 是否包含制表符或空格序列?

标签: linux shell csv awk


【解决方案1】:

awk 在这里可能有点矫枉过正。恕我直言,使用tr 进行这样的直接替换要简单得多:

$ cat ifile.txt | tr -s '[:blank:]' ',' > ofile.txt

【讨论】:

  • tr -s '[:blank:]' ',' ofile.txt ,可以防止cat命令。
  • 在大多数情况下,我更喜欢以cat 开头 - 当您有一个从左到右的执行流程时,它更容易阅读(恕我直言)。如果这是一次性转换,则必须执行cat 的性能开销可以忽略不计。如果这是每秒执行几十个这样的系统的一部分,那么您可能是对的。
  • 所以你说awk 是矫枉过正,然后使用cat ;-)
  • @fedorqui 是的,我想这很难证明这样的说法是正确的 :-)
  • &lt;ifile.txt tr -s ... &gt;ofile.txt 这样不是保留了从左到右的流程吗?
【解决方案2】:

只有 sed,没有别的

sed 's/ \+/,/g' ifile.txt > ofile.csv

猫文件.csv

1,4,22.0,3.3,2.3
2,2,34.1,5.4,2.3
3,2,33.0,34.0,2.3
4,12,3.0,43.0,4.4

【讨论】:

  • 一些描述会很好。
【解决方案3】:

这里是awk版本
awk 'BEGIN{print "ID,No,A,B,C"}{print $1","$2","$3","$4","$5}' ifile.txt

输出:

ID,No,A,B,C 
1,4,22.0,3.3,2.3 
2,2,34.1,5.4,2.3 
3,2,33.0,34.0,2.3
4,12,3.0,43.0,4.4

【讨论】:

    【解决方案4】:

    试试这个..

    tr -s " " < ifile.txt | sed 's/ /,/g' > ofile.txt
    

    输出

    1,4,22.0,3.3,2.3
    2,2,34.1,5.4,2.3
    3,2,33.0,34.0,2.3
    4,12,3.0,43.0,4.4
    

    【讨论】:

      【解决方案5】:

      一种可能性,不一定是最好的,是:

       sed -e '1i\
       ID,No,A,B,C' -e 's/[[:space:]]\{1,\}/,/g' ifile.txt
      

      在第 1 行之前插入标题;将一个或多个类似空格的字符的每个序列更改为逗号。换行符在传统(POSIX 标准——在本例中为 BSD 或 Mac OS X)sed 中是必需的; GNU sed 允许您使用:

      /opt/gnu/bin/sed -e '1i\' -e 'ID,No,A,B,C' -e 's/[[:space:]]\{1,\}/,/g'
      

      输出:

      ID,No,A,B,C
      1,4,22.0,3.3,2.3
      2,2,34.1,5.4,2.3
      3,2,33.0,34.0,2.3
      4,12,3.0,43.0,4.4
      

      另外,更简单的是,让sed 处理文件并使用echo 添加标题,就像您在大纲中所做的那样:

      {
      echo "ID,No,A,B,C"
      sed -e 's/[[:space:]]\{1,\}/,/g' ifile.txt
      } > ofile.txt
      

      经过审查,这可能是我会使用的。

      【讨论】:

        【解决方案6】:

        只需使用 awk 命令即可。

         awk '{
             printf("%d, %d, %.1lf, %.1lf,%.1lf\n", $1,$2,$3,$4,$5); 
         }'  input.txt > output.csv
        

        【讨论】:

          猜你喜欢
          • 2021-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-31
          • 1970-01-01
          • 2019-08-05
          • 2019-11-02
          相关资源
          最近更新 更多