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 / 775739
Accepted
dhm
dhm
Asked: 2024-05-03 19:03:49 +0800 CST2024-05-03 19:03:49 +0800 CST 2024-05-03 19:03:49 +0800 CST

maneira mais rápida de repetir uma lista

  • 772

Preciso fazer alguns testes de velocidade nos meus comandos do Linux. Os dados de entrada são uma lista de palavras. Por exemplo:

$ cat list
elephant
horse
raven
cat
dog
fish

Para um teste de velocidade razoável, preciso de um arquivo muito maior. Qual é a maneira mais rápida de repetir a lista acima centenas de milhares de vezes?

text-processing
  • 6 6 respostas
  • 102 Views

6 respostas

  • Voted
  1. Best Answer
    Zé Loff
    2024-05-03T19:36:26+08:002024-05-03T19:36:26+08:00
    $ jot -b "elephant
    > horse
    > raven
    > cat
    > dog
    > fish" 100000 > list
    

    joté uma ferramenta geralmente encontrada por padrão em sistemas BSD (incluindo macOS), mas também pode ser instalada na maioria dos sistemas Linux. O pacote no Ubuntu, por exemplo, é chamado athena-jot.

    • 4
  2. Stéphane Chazelas
    2024-05-04T01:41:00+08:002024-05-04T01:41:00+08:00

    Com algumas headimplementações:

    yes -- "$(cat list)" | head -c1G
    

    Daria a você 1 GiB do conteúdo listrepetido indefinidamente.

    Com ksh/zsh/bash, você pode substituir "$(cat list)"por "$(<list)".

    -cnão é uma opção padrão de heade nem todas as implementações que o suportam suportam esses sufixos KMGTPE.... Observe também que provavelmente cortará uma linha no meio e a deixará sem limite.

    yes -- "$(cat list)" | head -n 1000000
    

    Imprimir o valor 1000000 das linhas seria padrão e portátil.

    • 4
  3. terdon
    2024-05-03T20:26:26+08:002024-05-03T20:26:26+08:00

    Aqui está uma maneira, usando perl:

    perl -ge 'print <> x 10' < list 
    

    A -gflag diz perlpara ler o arquivo inteiro de uma vez e executar o script fornecido -enele. O script em si usa apenas a sintaxe perl especial <>que representa a entrada padrão e então imprimimos @listvezes 10. Na sua entrada, x 3para simplificar, isso fornece:

    $ perl -ge 'print <> x 3' < list 
    elephant
    horse
    raven
    cat
    dog
    fish
    elephant
    horse
    raven
    cat
    dog
    fish
    elephant
    horse
    raven
    cat
    dog
    fish
    

    Então, se você quiser milhares, basta fazer algo como

    perl -ge 'print <> x 100000000' < list > big.list
    

    No meu sistema, isso cria um arquivo de 3,2G em menos de 5 segundos:

    $ time perl -ge 'print <> x 100000000' < list > big.list
    
    real    0m4.705s
    user    0m0.509s
    sys 0m1.769s
    
    $ ls -lh big.list
    -rw-r--r-- 1 terdon terdon 3.2G May  3 13:25 big.list
    
    • 3
  4. Chris Davies
    2024-05-03T21:38:55+08:002024-05-03T21:38:55+08:00

    Duplique repetidamente. Este código é eficiente porque faz um loop apenas no log 2 n vezes para aumentar o tamanho do arquivo por um fator de n . (1 iteração para o dobro do tamanho, 2 iterações para quatro vezes o tamanho, etc.)

    for f in {1..17}; do cat list list > addition && mv -f addition list; done
    

    Isto lhe dará um fator de multiplicação de 131072 (2 17 ), que corresponde à sua necessidade de " repetir a lista acima centenas de milhares de vezes ".

    Você poderia usar cat a a a apara aumentar em 4 9 , alcançando um fator de multiplicação de 262144 com 9 iterações.

    for f in {1..9}; do cat list list list list > addition && mv -f addition list; done
    

    A {1..17}construção é uma expansão de chaves suportada por shells menos minimalistas, como ksh, bash, zsh(mas não dashou POSIX)

    • 1
  5. user9101329
    2024-05-03T21:59:27+08:002024-05-03T21:59:27+08:00

    Como você não se importa com os números repetidos, você pode combinar os comandos “timeout” e “yes” para criar repetições enormes muito rapidamente. Por exemplo:

    $ timeout 0.01s yes "$(<list)" >>very_long.txt
    

    Altere o argumento de tempo de 0,01 segundos para atender às suas necessidades. Mantenha-o baixo, pois mesmo com 1s você pode acabar com 50 milhões de linhas!

    • 1
  6. dbran
    2024-05-03T20:38:13+08:002024-05-03T20:38:13+08:00

    Basta usar um loop for:

    #!/bin/bash
    
    limit=100
    file="list.txt"
    content="$(< "$file")"
    
    for ((i = 0; i < limit; i++)); do
        printf '%s\n' "$content"
    done >> "$file"
    

    Isso basicamente anexa o conteúdo inicial dos ntempos da lista fornecida ao mesmo arquivo. Ajuste limite filefaça funcionar da maneira que você deseja.

    Se o conteúdo real da lista não for importante, você poderia fazer algo mais flexível e apenas anexar uma string arbitrária a um arquivo, assim:

    for ((i = 0; i < limit; i++)); do
        printf '%s\n' $RANDOM
    done > newlist.txt
    

    Ou diretamente da linha de comando usando uma sintaxe mais concisa:

    $ for _ in {1..100}; do printf '%s\n' $RANDOM; done > newlist.txt
    

    Editar: Obrigado a @muru pela sugestão. É claro que fazer um redirecionamento em cada iteração não é eficiente, anexar o conteúdo gerado logo após o loop for é muito melhor e mais rápido. Atualizei a resposta de acordo.

    Atualizar

    Se a eficiência for uma preocupação e uma solução mais escalável for necessária, você pode usar os comandos externos seqe shufgerar uma lista aleatória do tamanho que você precisa:

    $ seq 1 100 | shuf > newlist.txt
    

    Para ver a diferença com mais clareza, vamos aumentar o número de iterações para 1.000.000 e medir o tempo:

    $ limit=1000000
    $ time seq 1 $limit | shuf > newlist.txt
    real    0m0.157s
    user    0m0.136s
    sys     0m0.034s
    

    Isso é quase 40 vezes mais rápido do que executar o loop for com $RANDOM, que levou 5,935s na minha máquina com o mesmo limit.

    • 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