Como comentas en tu pregunta, awk
es realmente el camino a seguir. El uso cut
es posible junto con tr -s
exprimir espacios, como lo muestra la respuesta de kev .
Sin embargo, permítanme analizar todas las combinaciones posibles para futuros lectores. Las explicaciones se encuentran en la sección Prueba.
tr | cortar
tr -s ' ' < file | cut -d' ' -f4
awk
awk '{print $4}' file
intento
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
sed
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
Pruebas
Dado este archivo, probemos los comandos:
$ cat a
this is line 1 more text
this is line 2 more text
this is line 3 more text
this is line 4 more text
tr | cortar
$ cut -d' ' -f4 a
is
# it does not show what we want!
$ tr -s ' ' < a | cut -d' ' -f4
1
2 # this makes it!
3
4
$
awk
$ awk '{print $4}' a
1
2
3
4
intento
Esto lee los campos secuencialmente. Al usarlo _
, indicamos que esta es una variable desechable como una "variable basura" para ignorar estos campos. De esta manera, almacenamos $myfield
como el cuarto campo en el archivo, sin importar los espacios entre ellos.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
sed
Esto atrapa tres grupos de espacios y no espacios con ([^ ]*[ ]*){3}
. Luego, atrapa lo que viene hasta un espacio como el cuarto campo, con el que finalmente se imprime \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4