Cómo seleccionar la segunda columna después del patrón encontrado, los patrones son '100'

Cómo seleccionar la segunda columna después del patrón encontrado, los patrones son '100'

cat file_1:

height 100  3 name
gray   125  8 yellow
base   100  5 age
red    455  9 tea
level  100  7 yak

mi archivo final final debería tener solo una segunda columna que contenga el patrón '100'

cat final_file:

name 
age
yak

Respuesta1

Como sugiere val0x00ff, awkpuede cubrir esto

Esto coincidiría con 100 en cualquier lugar del campo 2, por ejemplo, "foo100bar" coincidiría.

awk '$2 ~ 100 {print $NF}' file_1 >final_file

Esto solo coincidiría con 100 en el campo 2.

awk '$2 == "100" { print $NF }' file_1 >final_file

Respuesta2

En un caso general haría algo como el siguiente código:

#!/bin/bash
matching_column=2  
filename="def"
awk -v matching_col=${matching_column}\
    -v printing_col=$((matching_column+2))\
    '$matching_col ~ 100 {printf "%s\n", $printing_col}' "$filename"  

De esta manera puedes seleccionar la columna que debe coincidir con el patternuso de la variable matching_col. Luego, la columna a imprimir se calcula como printing_col=matching_column+2. Y luego puede imprimir el valor especificado en el campo columna_impresión usando $printing_col.

Respuesta3

Con grepy pcre, se asumen espacios en blanco como delimitadores de columnas.

$ cat ip.txt 
height 100  3 name
gray   125  8 yellow
base   100  5 age
red    455  9 tea
level  100  7 yak

Hacer coincidir 100cualquier columna y extraer texto de la segunda columna después de eso

$ grep -oP '\b100\s+\S+\s+\K\S+' ip.txt 
name
age
yak

Hacer coincidir 100en la segunda columna y luego obtener texto en la segunda columna después de eso

$ grep -oP '^\S+\s+100\s+\S+\s+\K\S+' ip.txt 
name
age
yak

Ambos hacen uso de una búsqueda retrospectiva positiva marcada por \K. El primero se usa \bpara marcar el límite de las palabras (para evitar coincidencias como 1100)

Agregar > final_fileal comando para guardar la salida

Respuesta4

Creo que la solución steves awk anterior es la mejor, pero ya que estamos en eso, aquí hay una variante con sed

sed -n 's/.* 100 .* \([a-z].*$\)/\1/p' original_file > newfile

Lo que te atrapa...

cat newfile 
name
age
yak

información relacionada