试图从文件中删除行与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