2013-10-08 133 views
0

我有一个文本文件,需要删除其中不包含http的所有行。或者,它可以将所有包含http的文件输出到新文件中。使用命令行从文本文件中删除行

我的原始文件的名称是LIST.TXT,我需要生成像new.txt名称的新文件

我知道有几种方法通过命令行来做到这一点,但我“M真正需要的是最快的方法,因为我需要用几个文件来做到这一点,他们每个人都在大小数的演出......

+0

这可以用'sed'或'awk'或'grep'和否定运算符完成,请参阅http://unix.stackexchange.com/questions/11217/sed-one-liner-to-delete-any-不包含小写字母的行;很快就需要吗?这是一个正常的操作,还是一次又一次的使用? – zamnuts

+0

请注意,当你从文件中间删除文本时,你将需要用任何工具重写文件,所以它会很慢(1GB - > 100秒,如果你的驱动器可以维持10MB /秒,那么它可能将无法) – Coroos

回答

2

最快,最短的解决方案,

fgrep -v "http" 

当然,grep,egrep,awk,perl等使得这个更加可替代。

这是一个简短的shell脚本。编辑 “delhttp.sh” 包含

#!/bin/bash 
if [ $# -eq 0 ] ; then 
    fgrep -v "http" 
elif [ $# -eq 1 ] ; then 
    f1=${1:-"null"} 
    if [ ! -f $f1 ]; then echo "file $f1 dne"; exit 1; fi 
    fgrep -v "http" $f1 #> $f2 
elif [ $# -eq 2 ]; then 
    f1=${1:-"null"} 
    if [ ! -f $f1 ]; then echo "file $f1 dne"; exit 1; fi 
    f2=${2:-"null"} 
    fgrep -v "http" $f1 > $f2 
fi 

然后使用使这个文件可执行,

chmod +x delhttp.sh 

这里是一个Perl脚本(如果你愿意),编辑 “delhttp.pl” 包含

#!/bin/env perl 
use strict; 
use warnings; 
my $f1=$ARGV[0]||"-"; 
my $f2=$ARGV[1]||"-"; 
my ($fh, $ofh); 
open($fh,"<$f1") or die "file $f1 failed"; 
open($ofh,">$f2") or die "file $f2 failed"; 
while(<$fh>) { if(!($_ =~ /http/)) { print $ofh "$_"; } } 

再次,使这个可执行文件使用,

chmod +x delhttp.pl 
1

你可以使用grep。使用-v颠倒了匹配的意义,选择了不匹配的行。

grep -v 'http' list.txt 

使用Perl的一行:

perl -ne '/^(?:(?!http).)*$/ and print' list.txt > new.txt 
1
perl -i -lne 'print if(/http/)' your_file 

这上面的指令会从文件中删除所有的行,如果他们不具备断点续传。 如果你坚持保留原始文件备份时,您可以给无论如何而名为“.bak”选项的像下面提到:

perl -i.bak -lne 'print if(/http/)' your_file 

通过这个your_file.bak会产生这不过是的副本原始文件和原始文件将根据您的需要进行修改。 你也可以使用awk:

awk '/http/' your_file 

这将输出到控制台。您可以使用'>'将输出存储在新文件中。

相关问题