AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 774417
Accepted
Sistemas Libsur
Sistemas Libsur
Asked: 2024-04-13 01:58:41 +0800 CST2024-04-13 01:58:41 +0800 CST 2024-04-13 01:58:41 +0800 CST

Exibir ocorrências e contar linhas entre elas e depois da última

  • 772

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?

text-processing
  • 4 4 respostas
  • 218 Views

4 respostas

  • Voted
  1. Best Answer
    G-Man Says 'Reinstate Monica'
    2024-04-13T02:18:41+08:002024-04-13T02:18:41+08:00

    Claramente, você já percorreu 90% do caminho:

    awk '/tabela/ {se (n) imprimir NR-1-n; n=NR; imprimir}
         FIM {if (n) imprimir NR-1-n}'              arquivo

    Você não precisa $0 ~; isso está implícito.

    • 5
  2. kos
    2024-04-13T02:44:08+08:002024-04-13T02:44:08+08:00

    Eu montei uma solução Perl:.

    perl -Mfeature=say -e '
        while (<>) {
            if (/^table/) {
                $c && say $c;
                print;
                $c = 0;
                next;
            }
            $c++;
        }
        say $c;
    ' <input
    
    user@server ~/[REDACTED] (git)-[REDACTED] % perl -Mfeature=say -e '
        while (<>) {
            if (/^table/) {
                $c && say $c;
                print;
                $c = 0;
                next;
            }
            $c++;
        }
        say $c;
    ' <input
    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
    
    • 4
  3. Aeronautix
    2024-04-13T09:04:22+08:002024-04-13T09:04:22+08:00

    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:

    awk '
      /^$/ {next}
      /^table/ {
        if (precedingmatch)
          {print 0}
        else if (n)
          {print n}
        
        print; n=0; precedingmatch=1; matchesfound=1
      }
      !/^table/ {
        if (matchesfound) {n++}
        
        precedingmatch=0
      }
      END {if (matchesfound) {print n} else {print 0} }
    ' file.txt
    
    • precedingmatché usado para imprimir 0quando 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.txtcom algumas "tabelas vazias", uma nova linha e algumas linhas anexadas aleatoriamente:

    randomline_01
    randomline_02
    table_01 (id, field01, field02, field03, field04)
    table_02 (id, field01, field02, field03)
    record_01
    record_02
    
    table_03 (id, field01, field02, field03, field04)
    record_01
    record_02
    record_03
    table_04 (id, field01, field02, field03, field04, field05)
    table_05 (id, field01, field02, field03, field04)
    

    Saída:

    table_01 (id, field01, field02, field03, field04)
    0
    table_02 (id, field01, field02, field03)
    2
    table_03 (id, field01, field02, field03, field04)
    3
    table_04 (id, field01, field02, field03, field04, field05)
    0
    table_05 (id, field01, field02, field03, field04)
    0
    

    Um arquivo sem linhas de "tabela", um arquivo vazio ou um arquivo preenchido com novas linhas gera 0.

    • 2
  4. jubilatious1
    2024-04-15T13:31:28+08:002024-04-15T13:31:28+08:00

    Usando Raku (anteriormente conhecido como Perl_6)

    ~$ raku -ne 'BEGIN my $c = 0;  if /^table/ { $c && put $c; .put; $c = 0; next}; $c++;'  file
    

    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 tableno final, embora o OP diga que elas não serão encontradas):

    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
    table_06 (id, field01, field02, field03, field04)
    table_07 (id, field01, field02, field03, field04)
    

    Saída de amostra:

    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
    table_06 (id, field01, field02, field03, field04)
    table_07 (id, field01, field02, field03, field04)
    

    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 0quando nenhuma recordlinha seguir o tablecabeçalho (semelhante à resposta de @Aeronautix):

    ~$ raku -ne 'BEGIN my $c = 0;  if /^table/ { $c && put($c-1); .put; $c = 0}; $c++; END put($c-1);'  file
    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
    table_06 (id, field01, field02, field03, field04)
    0
    table_07 (id, field01, field02, field03, field04)
    0
    

    Nota: para todas as respostas acima, o código assume que a primeira linha começa com tablee o OP confirma que nenhuma linha perdida ocorrerá antes da primeira tablelinha.

    No entanto (para outros usuários/fontes de dados), se uma recordlinha 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

    • 1

relate perguntas

  • Grep para um conjunto de linhas de $START a $END AND que contém uma correspondência em $MIDDLE

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve