2009-04-27 14 views
3

Je suis en train de faire du traitement de texte sur un système Unix. J'ai accès à la ligne de commande sur cette machine et il a Python, Perl et les progams de traitement de texte par défaut installé, awk etc.Supprimer des lignes du fichier

J'ai un fichier texte qui ressemble à ci-dessous:

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 

Il est fondamentalement 3 lignes: ID ID Date

Je cherche à enlever toutes les lignes qui n'ont pas 2 ID et une date. Donc, les résultats de finaliser seront comme ceci:

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 

Comment les gars suggéreriez-vous cela? Au total, le fichier texte fait environ 30 000 lignes.

Vive

Eef

Répondre

14

Avec awk:

awk 'NF > 2' input_file > output_file 
+0

l'équivalent perl étant: perl -i -wane'print si @F> 6 'input_file> output_file – ysth

2

Avec 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

Vous ne voulez probablement pas lire dans un fichier ligne 30000 entier. – chills42

+0

@ chills42: c'est dinky. 60 octets maximum par ligne donnent 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

Avec Perl:

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

(peut-être modifier le modèle si les mauvaises lignes ont des espaces de fuite). Vous pouvez également utiliser grep -v, qui omettra le motif correspondant.

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

wow, une touche de génie! – fengshaun

3

juste mon travail perl, mais cela pourrait aider aussi:

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

utilisation inutile de chat. – hillu

+0

True, édité maintenant. Merci hillu. – hyperboreean

+0

ne devrait-il pas être 'scalar (@F)> 3'? – dsm

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