【问题标题】:Replace whitespace with a comma in a text file in Linux在 Linux 的文本文件中用逗号替换空格
【发布时间】:2010-11-19 06:20:40
【问题描述】:

我需要编辑一些文本文件(sar 的输出)并将它们转换为 CSV 文件。

我需要使用 sed 或 awk 函数(Linux 中的简单 shell 脚本)更改每个空格(可能是输出中数字之间的制表符)。

谁能帮帮我?我使用的每个命令根本没有更改文件;我试过gsub

【问题讨论】:

    标签: linux shell csv sed awk


    【解决方案1】:
    tr ' ' ',' <input >output 
    

    用逗号替换每个空格,如果需要,可以使用 -s 标志(挤压重复)进行传递,它将 SET1(空格)中列出的重复字符的每个输入序列替换为单个该字符的出现。

    在替换标签之后使用挤压重复:

    tr -s '\t' <input | tr '\t' ',' >output 
    

    【讨论】:

    • 我不知道原因,但是,只有这种使用“tr”的方法适用于我的情况。 sed 和 awk 都无法处理我的文件中由 Java 程序生成的空格。
    • 谢谢!挤压选项-s 确实是我想要的。
    【解决方案2】:

    尝试类似:

    sed 's/[:space:]+/,/g' orig.txt > modified.txt
    

    字符类 [:space:] 将匹配所有空格(空格、制表符等)。如果您只想替换单个字符,例如。只是空间,只使用它。

    编辑:实际上 [:space:] 包括回车,所以这可能不是你想要的。以下将替换制表符和空格。

    sed 's/[:blank:]+/,/g' orig.txt > modified.txt
    

    如愿以偿

    sed 's/[\t ]+/,/g' orig.txt > modified.txt
    

    在所有这些中,您需要注意文件中由空格分隔的项目不包含您要保留的自己的空格,例如。两个字。

    【讨论】:

    • sed 不是面向行的工具吗?如果是这样,那么 \n 是否包含在 [:space:] 中并不重要
    • GNU sed 需要这种语法:sed 's/[[:space:]]\+/,/g' 文件名
    • @glennjackman 谢谢你的工作!并补充您的评论,我使用-r 所以sed -r "s'[[:blank:]]+','g"
    • OSX 10.10.5:我希望 \s+ 工作:sed -E 's/\s+/,/g' orig.txt &gt; modified.txt,但它没有。甚至sed 's/[\t ]+/,/g' orig.txt &gt; modified.txt 也无法匹配标签。唯一对我有用的 sed 命令是:sed -E 's/[[:space:]]+/,/g' orig.txt &gt; modified.txt
    【解决方案3】:

    不看你的输入文件,只是猜测

    awk '{$1=$1}1' OFS=","
    

    重定向到另一个文件并根据需要重命名

    【讨论】:

    • 我假设右花括号后的最后一个 1 是打印该行的始终正确的模式?我会选择更具可读性的{$1=$1; print}
    • 是的。它是真实条件的 awk 习惯用法,默认打印到标准输出。
    【解决方案4】:

    这样的事情怎么样:

    cat texte.txt | sed -e 's/\s/,/g' > texte-new.txt
    

    (是的,有一些无用的 catting 和管道;我想也可以使用

    编辑: 正如@ghostdog74 在评论中指出的那样,绝对不需要 cat/pipe ;您可以将文件的名称提供给 sed :

    sed -e 's/\s/,/g' texte.txt > texte-new.txt
    

    如果“texte.txt”是这样的:

    $ cat texte.txt
    this is a text
    in which I want to replace
    spaces by commas
    

    你会得到一个“texte-new.txt”,看起来像这样:

    $ cat texte-new.txt
    this,is,a,text
    in,which,I,want,to,replace
    spaces,by,commas
    

    我不会只用新文件替换旧文件(如果我没记错的话,可以使用 sed -i 来完成;正如@ghostdog74 所说,这个文件会接受即时创建备份) :作为一种安全措施,保留可能是明智的(即使这意味着必须将其重命名为“texte-backup.txt”)

    【讨论】:

    • 是的,我在您发表评论时编辑了我的答案,说 -i (尽管我建议不要使用它,以保留文件的备份 - 这总是可以有用);不过,没有考虑过 sed myfile.txt;好点,谢谢!
    【解决方案5】:

    这个命令应该可以工作:

    sed "s/\s/,/g" < infile.txt > outfile.txt
    

    请注意,您必须将输出重定向到新文件。输入文件没有原地改变。

    【讨论】:

      【解决方案6】:

      sed 可以做到这一点:

      sed 's/[\t ]/,/g' input.file
      

      这将发送到控制台,

      sed -i 's/[\t ]/,/g' input.file
      

      将就地编辑文件

      【讨论】:

        【解决方案7】:

        这是一个 Perl 脚本,它将就地编辑文件:

        perl -i.bak -lpe 's/\s+/,/g' files*
        

        连续的空格被转换为一个逗号。
        每个输入文件都移动到 .bak

        使用这些命令行选项:

        • -i.bak 就地编辑并制作 .bak 副本

        • -p循环输入文件的每一行,自动打印该行

        • -l 在处理之前删除换行符,然后将它们添加回

        • -e执行perl代码

        【讨论】:

          【解决方案8】:

          如果您想用一个逗号替换任意序列的空白字符(制表符、空格),请使用以下命令:

          sed 's/[\t ]+/,/g' input_file > output_file
          

          sed -r 's/[[:blank:]]+/,/g' input_file > output_file
          

          如果您的某些输入行包含多余的前导空格字符并且不需要转换为逗号,那么您首先需要删除它们,然后将剩余的空白字符转换为逗号。对于这种情况,请使用以下内容:

          sed 's/ +//' input_file | sed 's/[\t ]+/,/g' > output_file
          

          【讨论】:

            【解决方案9】:

            这对我有用。

            sed -e 's/\s\+/,/g' input.txt >> output.csv
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-10-03
              • 2010-12-20
              • 2015-01-13
              • 1970-01-01
              • 2015-12-13
              相关资源
              最近更新 更多