【问题标题】:how to make the data in a file inorder? [closed]如何使文件中的数据有序? [关闭]
【发布时间】:2017-02-15 07:34:12
【问题描述】:

我有一个如下的 testfile.txt

/path/        345 firstline
/path2/     346     second line
/path3/ 347   third line having spaces
/path4/  3456 fourthline

现在我想做如下

/path/,345,firstline
/path2/,346,second line
/path3/,347,third line having spaces
/path4/,3456,fourthline

根据上面的输出,数据应该由3列组成,所有列用逗号分隔。输入文件中的列之间可能有一个或多个空格。例如,

/path/3456

也可以用 2 个标签分隔。第三列包含空格。

谁能帮我解决这个问题?

【问题讨论】:

    标签: regex bash csv sed spreadsheet


    【解决方案1】:

    您可以使用sed 命令来实现:

    我试过了,它对我有用:

    sed 's/[ \t]\+/,/' testfile.txt | sed 's/[ \t]\+/,/'
    

    它仅替换文件中空格或制表符的第一个和第二个实例。


    更新

    sed(流编辑器)使用命令来执行编辑。第一个参数's/[ \t]\+/,/' 是用于将一个表达式替换为另一个表达式的命令。进一步拆分此命令:

    语法:s/expression1/expression2/

    s - substitute
    / - expression separator
    [ \t]\+ - (expression1) this is the expression to find and replace (This regular expression matches one or more space or tab characters)
    , - (expression2) this is what you want to replace the first expression with
    

    当上面的命令运行时,在每一行你的表达式的第一个实例被替换。因为您还需要替换第二个分隔符,所以我将第一个 sed 命令的输出通过管道传输到另一个类似的命令。这将第二个分隔符替换为 ,


    希望这会有所帮助!

    【讨论】:

    • 谢谢,它按预期工作。
    • 您能否详细说明该命令的工作原理?
    【解决方案2】:
    tr -s ' ' <data |sed -e 's/\s/,/' -e  's/\s/,/'
    /path/,345,firstline
    /path2/,346,second line
    /path3/,347,third line having spaces
    /path4/,3456,fourthline
    

    这不是最好的方法,但它会产生所需的输出。

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2013-03-15
      相关资源
      最近更新 更多