【发布时间】: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 行。
欢迎和感谢您的任何想法或建议!
【问题讨论】:
我有一个 .csv 文件,我想在其中删除第 355686 行和第 1048576 行之间的行。
我在终端(在 MacOSx 上)中使用了以下命令:
sed -i.bak -e '355686,1048576d' trips3.csv
这会生成一个名为 trips3.csv.bak 的文件——但当我在 Excel 中重新打开它时,它仍然有 1,048,576 行。
欢迎和感谢您的任何想法或建议!
【问题讨论】:
awk '!(NR>355686 && NR <1048576)' your_file
【讨论】:
我怀疑问题在于 excel 使用回车符(\r,八进制 015)来分隔记录,而 sed 假设行由换行符(\n,八进制 012)分隔;这意味着 sed 会将整个文件视为一个非常长的行。我认为没有一种简单的方法可以让 sed 让 sed 将 CR 识别为行分隔符,但是使用 perl 很容易:
perl -n -015 -i.bak -e 'print if $. < 355686 || $. > 1048576' trips3.csv
(注意:如果 1048576 是文件中的“行”数,则可以省略 || $. > 1048576 部分。)
【讨论】:
应该做的一些咒语(如果你安装了 Ruby,显然)
ruby -pe 'exit if $. > 355686' < trips3.csv > output.csv
如果您更喜欢 Perl/Python,只需按照文档执行类似操作即可。 :)
另外,我正在使用 Dave 的 Ruby one-liners 之一。
编辑:抱歉,忘了说您需要'> output.csv' 将标准输出重定向到文件。
【讨论】:
不确定 osx sed 实现,但是 gnu sed 实现在传递带有备份扩展名的 -i 标志时首先将原始文件复制到指定的备份并就地修改原始文件。您应该会在原始文件 trip3.csv 中看到减少的行数
【讨论】: