试图用sed从文件中删除行 - 我做错了什么?

时间:2012-10-07 02:29:49

标签: macos excel csv sed

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

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

中看到减少的行数

答案 1 :(得分:3)

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

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

(注意:如果1048576是文件中“行”的数量,则可以不使用|| $. > 1048576部分。)

答案 2 :(得分:0)

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

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

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

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

编辑:对不起,忘了说你需要'&gt; output.csv'将stdout重定向到文件。

答案 3 :(得分:0)

awk '!(NR>355686  && NR <1048576)' your_file