Comme vous le commentez dans votre question, awk
est vraiment la voie à suivre. Pour utiliser cut
est possible avec tr -s
pour comprimer les espaces, comme réponse de kev montre.
Permettez-moi cependant de passer en revue toutes les combinaisons possibles pour les futurs lecteurs. Les explications se trouvent dans la section Test.
tr | cut
tr -s ' ' < file | cut -d' ' -f4
awk
awk '{print $4}' file
bash
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
sed
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
Tests
Avec ce fichier, nous allons tester les commandes :
$ 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 | cut
$ 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
bash
Cette opération lit les champs de manière séquentielle. En utilisant _
nous indiquons qu'il s'agit d'une variable jetable comme une "variable poubelle" pour ignorer ces champs. De cette façon, nous stockons $myfield
comme le 4e champ du fichier, quels que soient les espaces qui les séparent.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
sed
Cela permet d'attraper trois groupes d'espaces et aucun espace avec ([^ ]*[ ]*){3}
. Ensuite, il attrape tout ce qui vient jusqu'à un espace comme 4ème champ, qui est finalement imprimé avec \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4
13 votes
AWK est la voie à suivre.
0 votes
Duplicata possible de aide pour linux cut - comment spécifier plus d'espaces pour le délimiteur ?