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 NFqui 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}' fileou awk '{print $(NF-1), $NF}' fileou 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>field2ce 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-1est ($NF) - 1dans chaque awkmise en œuvre.
yaccgrammaire, 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-1et $NF(fonctionne sur Mac OS X 10.6.8 pour FreeBSD awket 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 - $NFfera 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 $exprcomme ayant une priorité [beaucoup] plus élevée que expr - expr. Puisque NFest une expression elle-même, $NF-1devrait s'évaluer ($NF)-1. Même SI, après tout, il existe en effet des implémentations awk qui évaluent $NF-1comme $(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