Como eu posso repetir cada campo de texto em uma coluna o número de vezes dado em outra coluna?

3

Eu tenho um arquivo, digamos 'test.txt' com:

5 80  
3 70  
4 60  

Agora, quero criar um gráfico R que se pareça com escadas / etapas: valor y 80 para 5 pontos de dados, valor y 70 para 3 pontos de dados e valor y de 60 para 4 pontos de dados, algo assim :

Como eu poderia transformar o test.txt em transformed.txt :

80  
80  
80  
80  
80  
70  
70  
70  
60  
60  
60  
60  

no shell, ou, alternativamente, imprimir diretamente o gráfico em R de test.txt .

    
por Ramet 11.01.2017 / 11:19

2 respostas

3

AWK é bom para isso:

awk '{while (-- > 0) print }' test.txt

Isso interpreta cada linha de test.txt como um registro de campos separados por espaços. Ele faz a contagem regressiva ( -- ) do valor do primeiro campo ( ) até que esse valor seja zero, imprimindo o valor do segundo campo ( ) em sua própria linha a cada vez.

Uma das vantagens deste método é que ele automaticamente tolera espaços em branco extras antes, entre ou após os números.

Especificamente:

Se preferir, você pode usar um for - loop :

awk '{for (;  > 0; --) print }' test.txt

Ou com um contador de loop dedicado variável :

awk '{for (i = ; i > 0; --i) print }' test.txt

Ou se achar mais intuitivo contar acima do que diminuir, você pode fazer isso:

awk '{for (i = 0; i < ; ++i) print }' test.txt
    
por Eliah Kagan 12.01.2017 / 00:01
5

Usando o Perl:

perl -pe 's/(\d+) (\d+\n)/ x /e' foo

Aqui:

  • -pe executa a expressão em todas as linhas, imprimindo-a automaticamente posteriormente
  • (\d+) corresponde a uma sequência de dígitos e (\d+\n) corresponde a uma sequência de dígitos por uma nova linha
  • Em seguida, x replica o segundo grupo correspondido tantas vezes quanto o valor do primeiro grupo correspondente. /e diz ao Perl que a substituição também deve ser avaliada como uma expressão Perl
por muru 11.01.2017 / 12:02