Alguém poderia me explicar esse script perl?

Alguém poderia me explicar esse script perl?

O seguinte é o comando perl dado pelo meu colega?

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

Ele disse que é para remover linhas em branco e verificar se há um número nos cinco primeiros campos.

Desde já, obrigado.

Responder1

Então os campos são separados por um sinal de til? O que é interessante é o delimitador entre as linhas. Será uma \nnova linha, mas não uma nova linha.

Então, como explicação:

o s/^/\\n/comando substitui a linha start com, \nmas somente se as condições seguintes ifforem verdadeiras:

  1. O número da linha deve ser maior que 1 ( $.>1)
  2. A linha precisa conter pelo menos 5 números separados por sinais de til.

Depois cada linha (exceto as vazias (serão evitadas pelo -lparâmetro) será impressa ( printf "%s", $_). O código não garante que os 5 primeiros campos contenham um 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$

Não tenho certeza, sobre as chaves ao redor do comando, você pode querer chamá-lo de outro lugar. Outra versão (talvez mais curta) que garante a existência de 5 campos contendo números é:

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$

Ele irá pular todas as linhas que não comecem com esses cinco campos e, portanto, pular as linhas vazias.

informação relacionada