Como repetir uma seqüência de números em uma coluna usando o comando awk

3

Meu arquivo de entrada contém dados como este.

//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
...
//address: 902e008 data: 1 id: 799 len: 0 size: 2
//address: 9096004 data: 1 id: 800 len: 0 size: 2
//address: 9096008 data: 1 id: 801 len: 0 size: 2
//address: 9097004 data: 1 id: 802 len: 0 size: 2
...
//address: 902e008 data: 1 id: 1599 len: 0 size: 2
//address: 9096004 data: 1 id: 1600 len: 0 size: 2
//address: 9096008 data: 1 id: 1601 len: 0 size: 2
//address: 9097004 data: 1 id: 1602 len: 0 size: 2

dos dados acima, o valor id não deve ultrapassar 800. A sequência deve ser repetida como 1,2, ... 799,1,2 ... 799.

então minha saída deve ser como abaixo

//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
...
//address: 902e008 data: 1 id: 799 len: 0 size: 2
//address: 9096004 data: 1 id: 1 len: 0 size: 2
//address: 9096008 data: 1 id: 2 len: 0 size: 2
//address: 9097004 data: 1 id: 3 len: 0 size: 2
...
//address: 902e008 data: 1 id: 799 len: 0 size: 2
//address: 9096004 data: 1 id: 1 len: 0 size: 2
//address: 9096008 data: 1 id: 2 len: 0 size: 2
//address: 9097004 data: 1 id: 3 len: 0 size: 2

Alguém poderia me ajudar a obter o comando acima no awk?

    
por Sudhakar Bethi 14.02.2017 / 19:25

3 respostas

4

Para voltar a 1 ao atingir 800, você terá que recalcular essa coluna como ((id - 1) % 799) + 1 , onde % é o operador de módulo:

$ awk '/^\/\// { $6 = (($6 - 1) % 799) + 1; print }' file
//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
//address: 902e008 data: 1 id: 799 len: 0 size: 2
//address: 9096004 data: 1 id: 1 len: 0 size: 2
//address: 9096008 data: 1 id: 2 len: 0 size: 2
//address: 9097004 data: 1 id: 3 len: 0 size: 2
//address: 902e008 data: 1 id: 1 len: 0 size: 2
//address: 9096004 data: 1 id: 2 len: 0 size: 2
//address: 9096008 data: 1 id: 3 len: 0 size: 2
//address: 9097004 data: 1 id: 4 len: 0 size: 2

Observe que, na sua saída esperada, o id do endereço 902e008 é 799. Isso não é possível se você estiver restringindo o intervalo para [1, 799].

    
por 14.02.2017 / 19:36
2

Isso funcionou para mim

awk 'BEGIN{FS=OFS=" "}{i++;if (i<5) {$6=i} else {i=0};print}' aa.txt

apenas altere i < 5 com i < 800

Teste:

$ cat aa.txt
//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
//address: 9050004 data: 1 id: 4 len: 0 size: 2
//address: 9050008 data: 1 id: 5 len: 0 size: 2
//address: 902e004 data: 1 id: 6 len: 0 size: 2

$ awk 'BEGIN{FS=OFS=" "}{i++;if (i<5) {$6=i} else {i=0};print}' aa.txt
//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
//address: 9050004 data: 1 id: 4 len: 0 size: 2
//address: 9050004 data: 1 id: 5 len: 0 size: 2
//address: 902e004 data: 1 id: 1 len: 0 size: 2
    
por 14.02.2017 / 19:41
0

Variante Perl de @Kusalananda:

perl -pE 's/id: *\K(\d+)/($1-1)%799+1/e'

(os números não se encaixam exatamente no exemplo do pedido)

    
por 14.02.2017 / 20:23

Tags