2009-04-27 21 views
3

Ich mache einige Textverarbeitung auf einem Unix-System. Ich habe Zugriff auf die Kommandozeile auf dieser Maschine und Python, Perl und die Standard-Textverarbeitung progams installiert, awk usw.Zeilen aus Datei entfernen

ich eine Textdatei, die wie unten aussieht:

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 

Es ist im Grunde 3 Zeilen: ID ID Datum

Ich suche alle Zeilen zu entfernen, die nicht 2 IDs und ein Datum haben. Die Ergebnisse werden also wie folgt aussehen:

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 

Wie würden Sie vorschlagen, dies zu tun? Insgesamt ist die Textdatei etwa 30.000 Zeilen lang.

Prost

Eef

Antwort

14

Mit awk:

awk 'NF > 2' input_file > output_file 
+0

das Äquivalent perl ist: perl -i -wane'print wenn @F> 6 'eingabedatei> ausgabedatei – ysth

2

Mit 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

Sie wahrscheinlich in einer ganzen 30000 Zeilendatei nicht lesen wollen. – chills42

+0

@ chills42: das ist dinky. Max 60 Bytes pro Zeile ergibt 1.7Mb. – ysth

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

Mit Perl:

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

(könnte das Muster ändern, wenn die schlechten Linien Leerzeichen haben). Sie können auch grep -v verwenden, wodurch das übereinstimmende Muster ausgelassen wird.

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

wow, ein genius touch! – fengshaun

3

arbeiten Nur mein Perl hier, aber dies könnte auch helfen:

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

nutzloser Gebrauch der Katze. – hillu

+0

True, jetzt bearbeitet. Danke Hillu. – hyperboreean

+0

sollte das nicht "skalar (@F)> 3" sein? – dsm

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