Tout ce que je veux, ce sont les deux dernières colonnes imprimées.
Tout ce que je veux, ce sont les deux dernières colonnes imprimées.
Réponses:
Vous pouvez utiliser la variable NF
qui correspond au nombre total de champs dans l'enregistrement d'entrée:
awk '{print $(NF-1),"\t",$NF}' file
cela suppose que vous ayez au moins 2 champs.
awk '{print $(NF-1) "\t" $NF}' file
ou awk '{print $(NF-1), $NF}' file
ou awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
est que awk interprète chaque variable séparée par des virgules comme son propre champ, donc le résultat sera en fait field1<space><tab><space>field2
, (car il utilisera un délimiteur d'espace blanc par défaut) par opposition à field1<tab>field2
ce qui est probablement ce vous attendez. l'utilisation du séparateur de champ de sortie (OFS) est presque toujours ce que vous voulez.
awk '{print $NF-1, $NF}' inputfile
Remarque: cela ne fonctionne que s'il existe au moins deux colonnes. Sur les enregistrements avec une colonne, vous obtiendrez un faux"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
est ($NF) - 1
dans chaque awk
mise en œuvre.
yacc
grammaire, ce qui est ironique étant donné ce que le A représente dans awk. Différentes versions de awk analysant les choses différemment? Grosse surprise!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- ou toute autre entrée où le 2ème dernier champ n'est pas un de moins que le dernier champ.
@jim mcnamara: essayez d'utiliser des parenthèses pour autour NF
, c'est-à $(NF-1)
- dire et $(NF)
au lieu de $NF-1
et $NF
(fonctionne sur Mac OS X 10.6.8 pour FreeBSD awk
et gawk
).
echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'
# output:
# 1 2
# 2 3
# two three
$(NF-1)
- qui au moins est plus portable que $NF-1
; c'est nettement moins ambigu. $(NF)
est exagéré, cependant - $NF
fera juste . Se protéger contre les lignes de moins de 2 colonnes vaut également la peine, car avec des lignes à une colonne, vous obtiendrez la première valeur de la première colonne deux fois , et avec des lignes de colonne zéro - c'est-à-dire vides - la commande awk échouerait complètement en raison d'une tentative pour accéder à un champ d'index -1.
l'utilisation de gawk présente le problème:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Je viens de mettre gawk sur Solaris 10 M4000: Donc, gawk est le cuplrit sur le problème $ NF-1 vs $ (NF-1). Question suivante que dit POSIX? par:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
Il n'y a pas de direction dans un sens ou dans l'autre. Pas bon. gawk implique une soustraction, d'autres awks impliquent un numéro de champ ou une soustraction. hmm.
$(NF-1)
est que les deux exemples de calcul de l'index de champ dans la spécification utilisent tous deux cette forme: $(NF-1)
et $(NF+2)
. Ensuite, il y a la section "Expressions dans awk", qui indique $expr
comme ayant une priorité [beaucoup] plus élevée que expr - expr
. Puisque NF
est une expression elle-même, $NF-1
devrait s'évaluer ($NF)-1
. Même SI, après tout, il existe en effet des implémentations awk qui évaluent $NF-1
comme $(NF-1)
, la leçon apprise ici est que l'utilisation $(NF-1)
est le choix sûr et portable.
essayez avec ça
$ cat /tmp/topfs.txt
/dev/sda2 xfs 32G 10G 22G 32% /
awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'
awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%
awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /
Veuillez essayer ceci pour prendre en compte tous les scénarios possibles:
awk '{print $(NF-1)"\t"$NF}' file
ou
awk 'BEGIN{OFS="\t"}' file
ou
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file