我有一个 .csv 文件,我想在其中删除第 355686 行和第 1048576 行之间的行。
我在终端(在 MacOSx 上)中使用了以下命令:
sed -i.bak -e '355686,1048576d' trips3.csv
这会生成一个名为 trips3.csv.bak 的文件——但当我在 Excel 中重新打开它时,它仍然有 1,048,576 行。
欢迎和赞赏您的任何想法或建议!
我怀疑问题是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
部分。)
不确定 osx sed 实现,但是当传递带有备份扩展名的 -i 标志时,gnu sed 实现首先将原始文件复制到指定的备份并就地修改原始文件。您应该会在原始文件 trip3.csv 中看到减少的行数
awk '!(NR>355686 && NR <1048576)' your_file
一些应该完成工作的咒语(如果你安装了 Ruby,显然)
ruby -pe 'exit if $. > 355686' < trips3.csv > output.csv
如果你更喜欢 Perl/Python,只要按照文档做类似的事情,你应该没问题。:)
另外,我正在使用Dave的Ruby one-liners 之一。
编辑:对不起,忘了说你需要'> output.csv'来将标准输出重定向到一个文件。