0

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

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

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

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

欢迎和赞赏您的任何想法或建议!

4

4 回答 4

3

我怀疑问题是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部分。)

于 2012-10-07T04:32:13.493 回答
3

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

于 2012-10-07T02:36:21.703 回答
0
awk '!(NR>355686  && NR <1048576)' your_file
于 2012-10-08T08:55:21.600 回答
0

一些应该完成工作的咒语(如果你安装了 Ruby,显然)

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

如果你更喜欢 Perl/Python,只要按照文档做类似的事情,你应该没问题。:)

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

编辑:对不起,忘了说你需要'> output.csv'来将标准输出重定向到一个文件。

于 2012-10-07T04:21:22.947 回答