Como repetir um bloco de texto?

3

Como uso o awk para repetir um bloco de texto 100 vezes?

ou seja

string1
string2
string3

se tornaria:

string1
string2
string3
string1
string2
string3
string1
string2
string3...
    
por jlh252 18.07.2016 / 23:05

5 respostas

3

(onde input é um arquivo que contém o texto a ser repetido)

Com o GNU awk (e supondo que a entrada não contenha bytes NUL):

awk -v n=100 -v RS='
awk -v n=100 -v ORS= '
  {all = all $0 RS}
  END {while (n--) print all}' < input
' -v ORS= '{while (n--) print}' < input

Portável:

set --
n=100; while [ "$n" -gt 0 ]; do
  set -- "$@" input
  n=$((n - 1))
done
cat "$@"

(note que se a entrada não terminar com um caractere de nova linha, será adicionado um).

Você também pode fazer coisas como:

printf '%.0sstring1\nstring2\nstring3\n' {1..100}

Esse funcionará independentemente de qual byte input contenha. Note, entretanto, que para valores maiores de n , e se seu shell não tiver cat builtin, você pode atingir o limite do sistema no tamanho dos argumentos para um comando (aqui cat ).

Com zsh ou versões recentes de bash ou ksh93 ou yash -o braceexpand , para um texto fixo, você pode fazer coisas como:

repeat 100 print -l string{1..3}

com zsh :

seq -f 'string1
string2
string%.0g' 3.0001 0.0001 3.0100

Se estamos sendo atrevidos, em sistemas com o GNU seq instalado, também podemos fazer:

awk -v n=100 -v RS='
awk -v n=100 -v ORS= '
  {all = all $0 RS}
  END {while (n--) print all}' < input
' -v ORS= '{while (n--) print}' < input
    
por 19.07.2016 / 11:16
3

com awk :

echo "t1 t2 t3" | awk '{l=$0; for(i=1;i++<100;) l=l" "$0} END{print l}'

E com perl :

echo "t1 t2 t3" | perl -ne 'chomp;print "$_ " x 100;'
    
por 18.07.2016 / 23:18
2

Embora essa questão esteja marcada como awk , gostaria de adicionar uma solução simples que não use awk :

seq 100 | xargs -n1 -I{} echo "1 2 3"

Se os dados com que você repete estiverem em um arquivo, use isso:

seq 100 | xargs -n1 -I{} cat filename

Outra solução pode usar o comando yes , que simplesmente repete seus argumentos:

yes "1 2 3" | head -n100
    
por 19.07.2016 / 11:28
0

Em vez de usar o AWK, eu simplesmente usaria um loop:

for i in $(seq 100); do
    echo string1
    echo string2
    echo string3
done
    
por 19.07.2016 / 11:44
0

Em /bin/bash , você pode parametrizar seus registros impressos para poder imprimir quaisquer três valores entre seus registros de arquivo, n vezes seguidas. Eles não precisam ser consecutivos.

Digamos que você queira imprimir os registros 2, 3 e 6 do seu arquivo de entrada: inputfile

$ cat inputfile
A
B
C
D
E
F
$ awk -v RS='\n' '{if(NR=="2"||NR=="3"||NR=="6") a[NR]=$0} \
END{for(i=1;i++<=100;) {print a[2]"\n"a[3]"\n"a[6];}}' inputfile

Indiscutivelmente, isso custa um pouco mais porque uma matriz é invocada.

    
por 19.07.2016 / 16:23