substitua o conteúdo de um campo com base no conteúdo de outro campo

1

Eu gostaria de dividir a primeira coluna com base no delimitador, aqui - . Com base no último valor, a última coluna, aqui coluna 2, deve ser preenchida. Se o valor for 01 ou 99 , substitua por 2 ou 1 , respectivamente.

#input
PE01-02-01  -9
PE01-02-99  -9
PE01-03-01  -9
PE01-03-99  -9
PE01-05-01  -9
PE01-05-99  -9

#output
PE01-02-01  2
PE01-02-99  1
PE01-03-01  2
PE01-03-99  1
PE01-05-01  2
PE01-05-99  1

você poderia por favor fornecer uma sugestão sobre como conseguir isso? Eu estava tentando dividir a primeira coluna em array, acessar o último elemento e atualizar a segunda coluna.

    
por Prradep 25.05.2016 / 13:50

2 respostas

2

Você poderia fazer isso de maneira críptica usando operadores condicionais aninhados? (também operadores ternários)

awk '{$2 = $1 ~ /-01$/? 2: $1 ~ /-99$/? 1: $1; print}' input

PE01-02-01 2
PE01-02-99 1
PE01-03-01 2
PE01-03-99 1
PE01-05-01 2
PE01-05-99 1

Alternadamente

awk '{n = split($1, a, "-"); $2 = a[n] == "01" ? 2: a[n] == "99"? 1: a[n]; print}' input
    
por 25.05.2016 / 14:03
2

Solução de Perl:

perl -ane 'BEGIN { $" = "\t" }
           $F[0] =~ /(..)$/,
               $F[-1] = { "01" => 2, "99" => 1 }->{$1} || $F[-1];
           print "@F\n" ' input_file > output_file
  • -n lê a linha de entrada por linha.
  • -a divide cada linha no espaço em branco no array @F.
  • $" está definido como tab para que os membros da matriz sejam separados por separadores entre aspas duplas ( "@F" )
  • $F[0] é comparado com um regex que extrai seus dois últimos caracteres em $1
  • $F[-1] , a última coluna, está definida como 2 ou 1 com base em $1 . Se $1 for outra coisa, o valor original é mantido.
por 25.05.2016 / 14:05

Tags