2013-10-08 128 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 

這將輸出到控制檯。您可以使用'>'將輸出存儲在新文件中。

相關問題