Como você comenta sua pergunta, awk
é realmente o caminho a percorrer. cut
É possível usar junto com tr -s
espremer espaços, como mostra a resposta de kev .
Permitam-me, no entanto, examinar todas as combinações possíveis para futuros leitores. As explicações estão na seção Teste.
tr | cortar
tr -s ' ' < file | cut -d' ' -f4
awk
awk '{print $4}' file
festança
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
sed
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
Testes
Dado este arquivo, vamos testar os 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
festança
Isso lê os campos sequencialmente. Ao usar _
, indicamos que essa é uma variável descartável como uma "variável indesejada" para ignorar esses campos. Dessa forma, armazenamos $myfield
como o quarto campo no arquivo, independentemente dos espaços entre eles.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
sed
Isso captura três grupos de espaços e sem espaços ([^ ]*[ ]*){3}
. Então, ele captura o que quer que chegue até um espaço como o quarto campo, com o qual finalmente é impresso \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4