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:
- O número da linha deve ser maior que 1 (
$.>1
) - 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.