¿Alguien podría explicarme este script en Perl?

¿Alguien podría explicarme este script en Perl?

¿El siguiente es el comando Perl dado por mi colega?

{perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename;} 

Dijo que es para eliminar líneas en blanco y verificar un número en los primeros cinco campos.

Gracias de antemano.

Respuesta1

¿Entonces los campos están separados por un signo de tilde? Lo interesante es el delimitador entre líneas. Será una \nnueva línea, pero no una.

Entonces como explicación:

el s/^/\\n/comando sustituye la línea que comienza con \npero solo si las condiciones posteriores ifson verdaderas:

  1. El número de línea tiene que ser mayor que 1 ( $.>1)
  2. La línea debe contener al menos 5 números separados por signos de tilde.

Luego, cada línea (excepto las vacías (se evitarán por -lparámetro) se imprimirá ( printf "%s", $_). ¡El código no garantiza que los primeros 5 campos contengan un número!

user@pc:/tmp$ cat inputfile.txt 
1~2~3~4~5

6~7~8~9~0

1~2~3~4~5
1~2~3~4

b~2~3
user@pc:/tmp$ perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename
1~2~3~4~5\n6~7~8~9~0\n1~2~3~4~51~2~3~4b~2~3user@pc:/tmp$

No estoy seguro acerca de las llaves alrededor del comando, es posible que desee llamarlo desde otro lugar. Otra versión (quizás más corta) que garantiza la existencia de 5 campos que contienen números es:

user@pc:/tmp$ perl -ne 'next unless (/^\d+~\d+~\d+~\d+~\d+/); print $_;' inputfile.txt 
1~2~3~4~5
6~7~8~9~0
1~2~3~4~5
user@pc:/tmp$

Omitirá todas las líneas que no comiencen con esos cinco campos y, por lo tanto, omitirá las líneas vacías.

información relacionada