Tengo un archivo con varios bloques de prueba. PARA CADA bloque de prueba, quiero poder extraer lo que está en el corchete, la línea que contiene la PRIMERA instancia de la palabra "área" y lo que está a la derecha del corchete. Todo será una cuerda. Básicamente, lo que quiero hacer es almacenar cada cadena en una variable en un hash para poder imprimirla en un archivo csv de 3 columnas.

Aquí hay una muestra de cómo se ve el archivo:

Estudiante- [K-6] Excepcional en Matemáticas
/home/area/kinder/mathadvance.txt, 12
Los estudiantes en los grados K-12 demostraron ser excepcionales en matemáticas.
Colocado en un programa especial después de la escuela.
Consulte /home/area/overall/performance.txt, 200

Estudiante- [Junior] Rendimiento débil
Estudiantes con un desempeño general débil.
Los servicios del programa de verano se ofrecen como se muestra en
"/home/area/services/summer.txt", 212

Estudiante- [K-6] Horarios de ejercicio físico
/home/area/pe/schedule.txt, 303
Horarios asignados para educación física según el nivel de grado del estudiante. Hacer referencia a
/home/area/overall/classtimes.txt, 90

Quiero tener un archivo csv final que se parezca a:

Grado, tema, camino
K-6, excepcional en matemáticas, /home/area/kinder/mathadvance.txt, 12
K-6, franjas horarias de ejercicio físico, /home/area/pe/schedule.txt, 303
Junior, rendimiento débil, "/home/area/services/summer.txt", 212

Como es un archivo csv, sé que también se separará en el número de línea al exportar a Excel, pero estoy de acuerdo con eso.
Comencé poniendo el tipo de grado en una matriz porque quiero poder agregarle más cadenas para diferentes niveles de grado.

Mi programa se ve así hasta ahora:

#!/usr/bin/perl
use strict;
use warnings;

my @grades = ("K-6", "Junior", "Community-College", "PreK");

Estaba pensando que tendré que hacer algún tipo de comando sed del sistema para tomar lo que está entre paréntesis y almacenarlo en una variable. Luego, tomaré todo lo que esté a la derecha del corchete en la línea y lo almacenaré en una variable. Y luego buscaré una línea que contenga "área" para obtener la ruta y la almacenaré como una cadena en una variable, las pondré en un hash y luego las imprimiré en csv. No estoy seguro de si estoy pensando en esto de la manera correcta. Además, NO TENGO IDEA sobre cómo hacer esto para cada BLOQUE de texto en el archivo. Lo necesito por bloque porque cada bloque tiene sus propias calificaciones, temas y caminos correspondientes.

2
sfr 8 oct. 2019 a las 23:07

1 respuesta

La mejor respuesta
perl -000 -ne '($grade, $topic) = /\[(.*)\] (.*)/;
               ($path) = m{(.*/area/.*)};
               print "$grade, $topic, $path\n"' -- file.txt
  • -000 activa el modo de párrafo, -n no leerá línea por línea, sino párrafo por párrafo
  • /\[(.*)\] (.*)/ coincide con los corchetes y lo que les sigue hasta una nueva línea. El interior de los corchetes y el siguiente texto se capturan utilizando los paréntesis.
  • m{(.*/area/.*)} captura la línea que contiene "área". Utiliza la sintaxis m{} en lugar de // para que no tengamos que hacer una barra diagonal inversa (evitando el llamado "síndrome del palillo inclinado")
6
choroba 8 oct. 2019 a las 20:28