Red de conocimiento informático - Problemas con los teléfonos móviles - Python, ¿cómo escribir una porción de datos mediante un puntero lógico para encontrar la fila con el último precio como un número par en los datos leídos?

Python, ¿cómo escribir una porción de datos mediante un puntero lógico para encontrar la fila con el último precio como un número par en los datos leídos?

Para una línea de Perl, seleccionar líneas para imprimir, eliminar e insertar/agregar es fácil, ya que imprimir/decir puede decidir si imprimir/insertar/agregar/eliminar una línea. Aunque simple, sigue siendo un buen lugar para discutir ejemplos que se usan ampliamente en sed.

Dado que las filas de salida/eliminar/insertar/añadir se operan mediante imprimir/decir en diferentes condiciones, este artículo solo presenta la operación de salida. Los principios de eliminación/insertar/añadir son en realidad los mismos.

Genera la primera línea

$ perl -lne 'print;exit' file.log

Genera la línea 13

$ perl -lne 'imprimir si $. == 13' file.log

Genera las primeras 10 líneas

$ perl -ne 'imprimir si $.

$ perl -ne 'imprimir si $.log$ perl -ne 'imprimir si 1..10' file.log$ perl -ne '$ lt;= 10 amp; . log$ perl -ne 'print; exit if $. == 10' file.log

Genera la última línea

$ perl -ne '$last=$_;END {print $last}' file.log:

O final del archivo eof:

$ perl -ne 'imprimir si eof' archivo.

El propósito de la función eof aquí es devolver 1 si la siguiente línea se lee hasta el final del archivo eof, de lo contrario

La salida cuenta regresivamente hasta 10 líneas

Impleméntelo Quizás un poco más complicado, pero la lógica es simple: agregue 10 filas de elementos a la matriz, y si hay más de 10 elementos en la matriz, elimine el primer elemento de la matriz.

$ perl -ne 'push @lines,$_; if(@linesgt;10){shift @lines;}END{print @lines}' /etc/passwd

Aquí moviste un elemento para asegurar la estabilidad de la "ventana": sólo tiene un máximo de 10 elementos. Otra forma segura es cortar los últimos 10 elementos de la matriz:

$ perl -ne 'push @lines,$_;@lines = @lines[@lines-10... $# líneas] if @linesgt;10;END{print @lines}' /etc/passwd

Genera la undécima línea desde abajo hasta la segunda línea desde abajo

Basado en el ejemplo anterior , este requisito es fácil de lograr.

Simplemente mantenga una matriz con 11 filas de elementos y genere los primeros 10 elementos al final.

$ perl -ne 'push @a,$_;shift @a if @agt;11;END{print @a[0. }/etc/passwd

Genere las líneas pares del archivo

Esto es muy simple, simplemente determine la paridad del número de línea.

$ perl -ne 'imprimir si $. 2 == 0' file.log$ perl -ne 'imprimir a menos que $.log

Salida de líneas coincidentes

$ perl -ne 'print if /regexp/' file.log

Genera las líneas entre dos líneas coincidentes

$ perl -ne 'print if /regexp1/ .../regexp2/' file.log

Genera la línea anterior de la línea coincidente

Simplemente guarda cada línea en una variable y, si la línea actual coincide, genera el valor guardado en la fila anterior.

$ perl -ne '/regexp/ amp; $last amp; print $last = $_' file.log

Si desea generar líneas coincidentes para el primeras M filas, simplemente guarde estos números de fila en una matriz y continúe con la selección de turnos.

Emite la última línea coincidente

$ perl -ne '$p amp print; $p = /regexp/' file.log

Perl La coincidencia; La operación de la expresión regular devuelve un valor booleano verdadero/falso, que indica éxito o fracaso, por lo que $p = /regexp/ significa que si la coincidencia es exitosa, $p es verdadero; de lo contrario, es falso.

Si $p es verdadero, genera la siguiente línea y continúa haciendo coincidir en la línea de salida; si la línea de salida aún coincide, continúa en la siguiente línea.

El proceso anterior se puede reescribir en una forma de una sola línea más razonable:

$ perl -ne 'if($p){print $p=0} $p if; /regexp/' file.log

El $p anterior es una variable de marca de estado. Si la coincidencia es exitosa, se marca como verdadera y la variable de estado se restablece al generarse.

Se puede utilizar otra lógica de procesamiento: escriba su propio bucle while, lea las líneas en lt;gt; y, si la coincidencia es exitosa, continúe leyendo la siguiente línea. Dado que la siguiente línea leída puede seguir coincidiendo, se puede utilizar la lógica de rehacer en el bucle while para volver al inicio del bucle while.

$ perl -se ' while(lt;gt;){if(/$reg/){if(eof){ exit }print $_ = lt;gt;;}rehacer if /$ reg/;}' -- -reg="REGEXP" file.log

Genera la línea coincidente y las siguientes 5 líneas

La variable de marca de estado $p se usa arriba, que Puede usarlo más profundamente.

Si hay una coincidencia, establezca $p en 5, luego reste $p de $p al generar la siguiente línea.

$ perl -ne 'if($p){print; $p--}if(/regexp/){$p = 5;print};' > Quitar énfasis de líneas consecutivas

$ perl -ne 'next if "$line" eq "$_" print $line = $_;'