
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, awk
puede 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 pattern
uso 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 grep
y 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 100
cualquier 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 100
en 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 \b
para marcar el límite de las palabras (para evitar coincidencias como 1100
)
Agregar > final_file
al 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