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 / 786175
Accepted
Ronnie
Ronnie
Asked: 2024-11-06 01:28:27 +0800 CST2024-11-06 01:28:27 +0800 CST 2024-11-06 01:28:27 +0800 CST

Em uma lista de caminhos de arquivo em um arquivo RTF, conte e classifique a saída com base no número de ocorrências de cada nome de arquivo

  • 772

Tenho um arquivo RTF que contém uma lista de caminhos de arquivos PDF. Como

Category1:
./Folder1/Folder2/1.pdf:18
./Folder3/2.pdf:18
./Folder5/4.pdf:10

Category2:
./Folder3/2.pdf:18
./Folder5/4.pdf:10

Category3:
./Folder1/Folder2/1.pdf:18
./Folder5/4.pdf:10

Category4:
./Folder6/7.pdf:10
./Folder5/4.pdf:10
./Folder3/2.pdf:18

SideNote: O número num depois de *.pdf:num pode ser ignorado. O caminho completo da pasta também pode ser ignorado. A entidade de interesse é apenas o nome do arquivo.pdf

Gostaria de ter uma saída classificada com relação aos nomes de PDF e seu número de ocorrências

A saída estaria no formato (nome do arquivo: número de vezes que o arquivo apareceu no rtf), como:

4.pdf :  4
2.pdf :  3

Nota 2: Qualquer arquivo mencionado menos de 3 vezes pode ser ignorado.

text-processing
  • 4 4 respostas
  • 65 Views

4 respostas

  • Voted
  1. Best Answer
    Romeo Ninov
    2024-11-06T03:30:45+08:002024-11-06T03:30:45+08:00

    Uma ferramenta possível é awk. Este comando pode fazer o trabalho:

    awk -F\/ '/pdf/{split($NF,a,":");b[a[1]]+=1} END {for (i in b) if(b[i]>2) print i" : "b[i]}' input_file
    

    O script usa /como delimitador, então splitno aúltimo campo com :delimitador, conta nas bocorrências de a. E no final imprime em loo todos os elementos de aonde count é > 2

    É possível simplificar dividindo a linha usando delimitadores for /e :. Nesse caso o script é:

    awk -F'[/:]' '/pdf/{b[$(NF-1)]+=1} END {for (i in b) if(b[i]>2) print i" : "b[i]}' input_file
    

    PS Se você quiser a soma dos valores :do arquivo de origem, você pode tentar algo como:

    awk -F'[/:]' '/pdf/{b[$(NF-1)]+=1;c[$(NF-1)]+=$NF} END {for (i in b) if(b[i]>2) print i" : "b[i]", "c[i]}'  input_file
    

    Acabei de adicionar cuma matriz para somar os valores depois:

    • 1
  2. jubilatious1
    2024-11-06T06:01:12+08:002024-11-06T06:01:12+08:00

    Usando Raku (anteriormente conhecido como Perl_6)

    ~$ raku -ne 'BEGIN my %seen; 
                 if .chars && /\.pdf/ { $_.subst(/ <?after \.pdf> \: \d+ $ /).IO.basename andthen %seen{$_}++ }; 
                 END .say for %seen.sort: +*.key.match(/^ \d+ <?before \.pdf>/);'   file
    

    OU (mais simplesmente):

    ~$ raku -ne 'BEGIN my %seen; 
                 if .chars && s/ <?after \.pdf> \: \d+ $ // { %seen{$_.IO.basename}++ }; 
                 END .say for %seen.sort: +*.key.match(/^ \d+ <?before \.pdf>/);'   file
    

    OU (ainda mais simplesmente):

    ~$ raku -ne 'BEGIN my %seen; 
                 if .chars && s/ <?after \.pdf> \: \d+ $ // { %seen{$_.IO.basename}++ }; 
                 END .say for %seen.sort: +*.key.IO.extension: "";'   file
    

    Raku é uma linguagem de programação da família Perl. Usando os sinalizadores de linha de comando não autoimpressivos awkdo tipo - do Raku -ne, você pode obter um hash classificado de pares de chave/valor onde o valor por nome de arquivo PDF é igual à contagem do número de vezes que o nome do arquivo foi visto. A saída é classificada numericamente de acordo com o nome do arquivo (como um número). Usar .sayno ENDbloco fornecerá a você =>uma saída "chave/valor" pareada:

    Exemplo de entrada:

    Category1:
    ./Folder1/Folder2/1.pdf:18
    ./Folder3/2.pdf:18
    ./Folder5/4.pdf:10
    
    Category2:
    ./Folder3/2.pdf:18
    ./Folder5/4.pdf:10
    
    Category3:
    ./Folder1/Folder2/1.pdf:18
    ./Folder5/4.pdf:10
    
    Category4:
    ./Folder6/7.pdf:10
    ./Folder5/4.pdf:10
    ./Folder3/2.pdf:18
    

    Exemplo de saída:

    1.pdf => 2
    2.pdf => 3
    4.pdf => 4
    7.pdf => 1
    

    Se você precisar de uma saída de "valor-chave" pareada :, altere o ENDbloco do seu código para:

     END put($_.key, " : ", $_.value) for %hash.sort: +*.key.IO.extension: "";'
    

    Se você precisar eliminar pares com .value < 2, altere ainda mais o ENDbloco do seu código para:

     END put($_.key, " : ", $_.value if .value > 2 ) for %hash.sort: +*.key.IO.extension: "";'
    

    Por fim, se você preferir um código escrito no estilo "encadeado" de chamada de método/função, o código abaixo fornece o mesmo código (desejado) que o acima:

    ~$ raku -e 'my  %seen = lines.grep( *.chars > 0 && / \.pdf /)  \ 
                            .map( *.subst(/ <?after \.pdf> \: \d+ $ / ).IO.basename).Bag;  \ 
                for %seen.sort( +*.key.IO.extension: "") { 
                    put $_.key ~" : "~ $_.value if .value > 2 };'   file
    

    https://raku.org

    • 1
  3. Hannu
    2024-11-06T01:48:34+08:002024-11-06T01:48:34+08:00

    Extraia esse arquivo para ser um arquivo de TEXTO e faça

    $ sed < TEXT.txt -nre  's,.*/([^:/]+).*,\1,p' | sort | uniq -c
          2 1.pdf
          3 2.pdf
          4 4.pdf
          1 7.pdf
    
    $ sed < TEXT.txt -nre  's,.*/([^:/]+).*,\1,p' | sort | uniq -c | grep -vE '\s+[12] '
          3 2.pdf
          4 4.pdf
    
    • 0
  4. Stéphane Chazelas
    2024-11-06T22:24:37+08:002024-11-06T22:24:37+08:00

    Com perl:

    $ perl -lne '$c{$1}++ if m{([^/]*\.pdf):\d+$};
                 END {
                   print "$_ : $c{$_}" for
                     sort {$c{$b} <=> $c{$a}} grep {$c{$_} > 2} keys %c
                 }' your-file
    4.pdf : 4
    2.pdf : 3
    
    • 0

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