Como subtrair const do arquivo no awk? [duplicado]

0

Como posso sub 1 de cada elemento do meu arquivo txt. Eu tinha realmente tentado semelhante a isso pergunta, mas não foi sucesso completo.

Suponha que eu tenha arquivo no seguinte formato

2,4,5
1,2,3
14,12,1

Agora quero que o arquivo seja

// basically subtract 1 from all 
1,3,4
0,1,2  
13,11,0

O que eu tentei até agora é

$awk '{if(getline != 0){
          for(i = 0; i <=NF; i++){
              $(i)=$(i)-1;
          }
       } print;}}'

Eu estava tentando ler até o final do arquivo e sub 1 de cada elemento, mas quando eu faço isso eu apenas -1

    
por pokche 29.11.2016 / 01:27

1 resposta

1

A lógica está certa, mas você cometeu alguns erros:

awk -vOFS=, -F, '{
      for(i = 1; i <=NF; i++ ){
          $i -= 1;
      }
      print;
   }' file.txt
  • getline (como você usou) lê a próxima linha em $0 - não faz sentido aqui.

  • Você precisa dizer ao awk para dividir ( FS ou usando -F ) em uma vírgula, por padrão ele será dividido em espaço em branco

  • $0 é a linha inteira, portanto, você deseja iniciar o loop em i = 1

  • Se você quiser imprimir vírgulas na saída, precisará definir OFS=, (separador de campo de saída).

Como alternativa, você pode usar o perl:

perl -ple 's{(\d+)}{$1 - 1}eg;' file.txt
    
por 29.11.2016 / 01:42

Tags