Eliminar las líneas de archivo
-
16-09-2019 - |
Pregunta
Estoy haciendo algo de procesamiento de texto en un sistema UNIX. Voy a tener acceso a la línea de comandos en esta máquina y tiene Python, Perl y los progams de procesamiento de texto por defecto instalado, awk, etc.
Tengo un archivo de texto que se parece a continuación:
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
Se trata básicamente de 3 filas: Identificador de fecha
Busco para eliminar todas las líneas que no tienen 2 Identificación de y una fecha. Por lo que los resultados finising serán así:
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
¿Cómo te chicos sugieren hacer esto? En total, el archivo de texto es de alrededor de 30.000 líneas.
Saludos
Eef
Solución
Con awk
:
awk 'NF > 2' input_file > output_file
Otros consejos
grep ':' filename
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)
Con Perl:
perl -ne 'print if /^([0-9]+\s+){2}.+$/' $filename
Sólo trabajando mi Perl aquí, pero esto podría ayudar así:
perl -lane 'if (scalar(@F) == 3) { print @F;}' file >> file.out
Con 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,
awk "NF>1" < filename
perl -i -lane 'print if($F[1])' file
sed '/^[0-9]$/d' filename
(podría tener que modificar el patrón de si las líneas malos tienen espacios finales). También puede utilizar grep -v, que se omita el patrón emparejado.