Alguém poderia me explicar este script perl?

1

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 os primeiros cinco campos para um número.

Obrigado antecipadamente.

    
por Arun Kumar 31.05.2017 / 12:26

1 resposta

2

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

Então, como explicação:

o comando s/^/\n/ substitui o início da linha por \n , mas somente se as condições após if forem ambas 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.

Em seguida, cada linha (exceto as vazias (será evitada pelo parâmetro -l ) será impressa ( printf "%s", $_ ). O código não garante que os primeiros 5 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 suas 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 começarem com esses cinco campos e, portanto, pular linhas vazias.

    
por 31.05.2017 / 13:36

Tags