【问题标题】:Trying to delete lines from file with sed -- what am I doing wrong?尝试使用 sed 从文件中删除行——我做错了什么?
【发布时间】:2012-09-27 18:04:20
【问题描述】:

我有一个 .csv 文件,我想在其中删除第 355686 行和第 1048576 行之间的行。

我在终端(在 MacOSx 上)中使用了以下命令:

sed -i.bak -e '355686,1048576d' trips3.csv 

这会生成一个名为 trips3.csv.bak 的文件——但当我在 Excel 中重新打开它时,它仍然有 1,048,576 行。

欢迎和感谢您的任何想法或建议!

【问题讨论】:

    标签: macos excel csv sed


    【解决方案1】:
    awk '!(NR>355686  && NR <1048576)' your_file
    

    【讨论】:

      【解决方案2】:

      我怀疑问题在于 excel 使用回车符(\r,八进制 015)来分隔记录,而 sed 假设行由换行符(\n,八进制 012)分隔;这意味着 sed 会将整个文件视为一个非常长的行。我认为没有一种简单的方法可以让 sed 让 sed 将 CR 识别为行分隔符,但是使用 perl 很容易:

      perl -n -015 -i.bak -e 'print if $. < 355686 || $. > 1048576' trips3.csv
      

      (注意:如果 1048576 是文件中的“行”数,则可以省略 || $. &gt; 1048576 部分。)

      【讨论】:

      • 这个成功了!非常感谢。也是我第一次使用 Perl,非常感谢。
      【解决方案3】:

      应该做的一些咒语(如果你安装了 Ruby,显然)

      ruby -pe 'exit if $. > 355686' < trips3.csv > output.csv
      

      如果您更喜欢 Perl/Python,只需按照文档执行类似操作即可。 :)

      另外,我正在使用 Dave 的 Ruby one-liners 之一。

      编辑:抱歉,忘了说您需要'> output.csv' 将标准输出重定向到文件。

      【讨论】:

        【解决方案4】:

        不确定 osx sed 实现,但是 gnu sed 实现在传递带有备份扩展名的 -i 标志时首先将原始文件复制到指定的备份并就地修改原始文件。您应该会在原始文件 trip3.csv 中看到减少的行数

        【讨论】:

        • 嗯...trips3.csv 和trips3.csv.bak 是一模一样的,很遗憾。
        猜你喜欢
        • 2019-04-20
        • 2018-06-19
        • 2021-02-15
        • 1970-01-01
        • 2020-05-31
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多