replace el contenido de un campo basado en el contenido en otro campo

Me gustaría dividir la primera columna basada en el delimitador, aquí - . En function del último valor, la última columna, aquí la columna 2, debe completarse. Si el valor es 01 o 99 , reemplácelo con 2 o 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 

¿podría darnos una sugerencia sobre cómo lograr esto? Estaba tratando de dividir la primera columna en matriz, acceder al último elemento y luego actualizar la segunda columna.

¿Podría hacer esto de forma algo críptica utilizando operadores condicionales nesteds ?: (Aka operadores ternarios)

 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 

Alternativamente

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

Solución Perl:

 perl -ane 'BEGIN { $" = "\t" } $F[0] =~ /(..)$/, $F[-1] = { "01" => 2, "99" => 1 }->{$1} || $F[-1]; print "@F\n" ' input_file > output_file 
  • -n lee la input línea por línea.
  • -a divide cada línea en espacios en blanco en la matriz @F.
  • $" está configurado para tabular de modo que los miembros de la matriz estén separados por tabulaciones entre comillas dobles ( "@F" )
  • $F[0] se compara con una expresión regular que extrae sus dos últimos caracteres en $1
  • $F[-1] , la última columna, se establece en 2 o 1 en function de $1 . Si $1 es otra cosa, se guarda el valor original.