2 votos

Combinación de valores de filas consecutivas, si tienen los mismos valores en una columna diferente (AWK)

Necesito combinar el primer valor ($1) de filas consecutivas, si su cuarto valor ($4) es el mismo (I-PER).

Me las arreglé para filtrar los valores que necesitamos, simplemente usando awk:

awk ' ($4 == "I-PER") {printf $1; printf "\n" }

También he encontrado la manera de combinar las filas con valores de columna duplicados pero no consecutivos.

Ejemplo (De Entrada):

Comandante  comandante  NP00000 I-PER
de  de  SPS00   I-PER
la  el  DA0FS0  I-PER
Guardia guardia NP00000 I-PER
Civil   civil   NP00000 I-PER
Pamplona    pamplona    NP00000 I-LOC
Poblador    poblador    NP00000 I-PER

Ejemplo (De Salida):

Comandante de la Guardia Civil
Poblador

2voto

KasiyA Puntos 10471

Otra awk solución para evitar la impresión repetida \newlines si la condición no se cumple en cualquier línea:

awk '($4=="I-PER"){ printf SEP$1; SEP=" "; C=1; next } 
      C==1{ SEP=""; print ""; C=0} END{print ""}' infile

ejemplo de entrada:

Comandante  comandante  NP00000 I-PER
de  de  SPS00   I-PER
la  el  DA0FS0  I-PER
Guardia guardia NP00000 I-PER
Civil   civil   NP00000 I-PER
no I-PER in fourth column
anotherline no I-PER in fourth column
Pamplona    pamplona    NP00000 I-LOC
Poblador    poblador    NP00000 I-PER

El resultado es:

Comandante de la Guardia Civil
Poblador

0voto

dessert Puntos 928

Un rápido y un poco sucio solución con un operador ternario (condition?true:false), la prueba de que usted haya proporcionado y se imprime $1 , seguido por un espacio o un salto de línea:

awk '{printf $4=="I-PER"?$1" ":"\n"}'

Salida:

$ <test awk '{printf $4=="I-PER"?$1" ":"\n"}'
Comandante de la Guardia Civil 
Poblador

He aquí una muy mala enfoque alternativo con una matriz – al menos este no produce líneas vacías como la de arriba, para múltiples sucesivas no-I-PER líneas:

awk '{
  if ($4=="I-PER") {a[i++]=$1}
  else if (length(a)>0) {
    for (i in a) {printf a[i]" ";delete a[i]}
    print ""
    }
  }
 END {
  if (length(a)>0) {
    for (i in a) printf a[i]" ";print ""}
  }'

Salida:

$ <test awk '{if($4=="I-PER"){a[i++]=$1}else if(length(a)>0){for(i in a){printf a[i]" ";delete a[i]};print ""}}END{if(length(a)>0){for(i in a)printf a[i]" ";print ""}}'
Comandante de la Guardia Civil 
Poblador

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: