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 \n
nova linha, mas não uma nova linha.
Então, como explicação:
o s/^/\\n/
comando substitui a linha start com, \n
mas somente se as condições seguintes if
forem 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.
Depois cada linha (exceto as vazias (serão evitadas pelo -l
parâ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.