Eu tenho este arquivo:
table_01 (id, field01, field02, field03, field04)
record_01
record_02
record_03
table_02 (id, field01, field02, field03)
record_01
table_03 (id, field01, field02, field03, field04)
record_01
record_02
table_04 (id, field01, field02, field03, field04, field04)
record_01
table_05 (id, field01, field02, field03, field04)
record_01
record_02
record_03
record_04
Quero ter um script para exibir as linhas com a ocorrência da palavra “ table
” e exibir o número de linhas entre elas e as linhas após a última ocorrência.
Então a saída seria:
table_01 (id, field01, field02, field03, field04)
3
table_02 (id, field01, field02, field03)
1
table_03 (id, field01, field02, field03, field04)
2
table_04 (id, field01, field02, field03, field04, field04)
1
table_05 (id, field01, field02, field03, field04)
4
Até agora eu tenho este script:
awk '$0 ~ /table/ {if (n) print NR-1-n; n=NR}' file
Sua saída é:
3
1
2
1
Mas este script não exibe as linhas com a ocorrência de “ table
” e não exibe as linhas após a última ocorrência. Como posso modificá-lo para exibir o que está faltando?
Claramente, você já percorreu 90% do caminho:
Você não precisa
$0 ~
; isso está implícito.Eu montei uma solução Perl:.
Minha resposta assume um cenário em que pode haver tabelas vazias (linhas de "tabela vazia"/linhas correspondentes) e um cenário generalizado em que pode haver linhas extras (não-tabela/não-correspondentes) anexadas ao arquivo de entrada.
Neste cenário, para exibir as linhas da tabela (linhas correspondentes) e contar as ocorrências das linhas de registro seguintes (linhas não correspondentes), use
awk
, se o padrão desejado for^table
:precedingmatch
é usado para imprimir0
quando duas linhas subsequentes são linhas da tabela.matchesfound
é usado para ignorar a impressão da contagem de linhas que não são de tabela encontradas antes de qualquer primeira linha da tabela.Amostra
file.txt
com algumas "tabelas vazias", uma nova linha e algumas linhas anexadas aleatoriamente:Saída:
Um arquivo sem linhas de "tabela", um arquivo vazio ou um arquivo preenchido com novas linhas gera
0
.Usando Raku (anteriormente conhecido como Perl_6)
Raku é uma linguagem de programação da família Perl que oferece suporte de alto nível para Unicode. Esta solução Raku segue o esboço geral (em Perl) postado por @kos e @terdon.
Exemplo de entrada (linhas extras
table
no final, embora o OP diga que elas não serão encontradas):Saída de amostra:
Acima dá a mesma resposta que as respostas Perl de @kos e @terdon. Para ser mais explícito, a primeira instrução dentro do bloco pode ser escrita
$c.Bool && put $c;
ou mesmo$c.so && put $c;
, mas o código acima é suficiente.INSERIR ZERO SE NÃO HÁ REGISTROS "NÃO TABELA" INTERVENIENTES:
Aqui está o código para retornar
0
quando nenhumarecord
linha seguir otable
cabeçalho (semelhante à resposta de @Aeronautix):Nota: para todas as respostas acima, o código assume que a primeira linha começa com
table
e o OP confirma que nenhuma linha perdida ocorrerá antes da primeiratable
linha.No entanto (para outros usuários/fontes de dados), se uma
record
linha perdida for encontrada no topo do arquivo, a primeira resposta retornará o número de linhas antes da primeira linha da tabela. A segunda resposta retornará "um menos" o número de linhas antes da primeira linha da tabela.https://raku.org