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

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

我在terminal(在MacOSx上)使用了下面的命令:

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

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

任何想法或build议,你有欢迎和赞赏!

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

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

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

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

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

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

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

另外,我正在使用Dave的一个Ruby单线程。

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

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