2009-04-27 133 views
3

我在unix系統上做了一些文本處理。我已經進入命令行本機上,它有Python和Perl和安裝的默認文字處理progams時,awk等刪除文件中的行

我有一個文本文件,它看起來象下面這樣:

2029754527851451717 
2029754527851451717 
2029754527851451717 
2029754527851451717 
2029754527851451717 
2029754527851451717 1232453488239 Tue Mar 3 10:47:44 2009 
2029754527851451717 1232453488302 Tue Mar 3 10:47:44 2009 
2029754527851451717 1232453488365 Tue Mar 3 10:47:44 2009 
2895635937120524206 
2895635937120524206 
2895635937120524206 
2895635937120524206 
2895635937120524206 
2895635937120524206 
5622983575622325494 1232453323986 Thu Feb 12 15:57:49 2009 

這是基本上3行:ID ID日期

我期待刪除所有沒有2個ID和一個日期的行。因此,最終結果將如下所示:

2029754527851451717 1232453488239 Tue Mar 3 10:47:44 2009 
2029754527851451717 1232453488302 Tue Mar 3 10:47:44 2009 
2029754527851451717 1232453488365 Tue Mar 3 10:47:44 2009 
5622983575622325494 1232453323986 Thu Feb 12 15:57:49 2009 

您會如何建議您這樣做?文本文件總共大約30,000行。

乾杯

EEF

回答

14

隨着awk

awk 'NF > 2' input_file > output_file 
+0

等價的perl存在:perl -i -wane'print if @F> 6'input_file> output_file – ysth 2009-04-27 15:25:00

2

使用Python:

file = open(filename, 'r') 
lines = file.readlines() 
file.close() 

p = re.compile('^\d*$') 

for line in lines: 
    if not p.search(line): print line, 
+0

你可能不希望在整個30000行文件中讀取。 – chills42 2009-04-27 14:46:06

+0

@寒戰42:這很簡單。每行最多60個字節給出1.7Mb。 – ysth 2009-04-27 15:27:28

5
with open(source_filename) as src: 
    with open(dest_filename, 'w') as dst: 
     for line in src: 
      if len(line.split()) > 1: 
       dst.write(line) 
4

用Perl:

perl -ne 'print if /^([0-9]+\s+){2}.+$/' $filename 
-1
sed '/^[0-9]$/d' filename 

(可能需要修改的模式如果壞線有尾隨空格)。你也可以使用grep -v,它會省略匹配的模式。

1
awk "NF>1" < filename 
8
grep ':' filename 
+0

哇,天才一摸! – fengshaun 2009-04-27 23:27:15

3

只是在這裏工作我的Perl,但是這可能會有所幫助:

perl -lane 'if (scalar(@F) == 3) { print @F;}' file >> file.out 
+0

沒用的貓用。 – hillu 2009-04-27 15:51:20

+0

正確,現在編輯。謝謝hillu。 – hyperboreean 2009-04-27 17:09:46

+0

不應該是'標量(@F)> 3'嗎? – dsm 2009-04-28 09:36:33

1
perl -i -lane 'print if($F[1])' file