Voglio solo stampare le ultime due colonne.
Voglio solo stampare le ultime due colonne.
Risposte:
È possibile utilizzare la variabile NF
impostata sul numero totale di campi nel record di input:
awk '{print $(NF-1),"\t",$NF}' file
questo presuppone che tu abbia almeno 2 campi.
awk '{print $(NF-1) "\t" $NF}' file
o awk '{print $(NF-1), $NF}' file
o awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
è che awk interpreta ogni variabile separata da virgole come il proprio campo, quindi il risultato sarà effettivamente field1<space><tab><space>field2
, (perché userà delimitatore di spazio bianco per impostazione predefinita) al contrario di quello field1<tab>field2
che è probabilmente ciò ti aspetti. usare Output Field Separator (OFS) è quasi sempre quello che vuoi.
awk '{print $NF-1, $NF}' inputfile
Nota: funziona solo se esistono almeno due colonne. Sui record con una colonna otterrai un falso"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
è ($NF) - 1
in ogni awk
implementazione.
yacc
grammatica, il che è ironico dato ciò che la A sta per in awk. Versioni diverse di awk che analizzano le cose in modo diverso? Grande sorpresa!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- o qualsiasi altro input in cui il penultimo campo non è uno in meno dell'ultimo campo.
McNamara @jim: provare a utilizzare parentesi per circa NF
, vale a dire $(NF-1)
e $(NF)
invece di $NF-1
e $NF
(funziona su Mac OS X 10.6.8 per FreeBSD awk
e 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)
- che almeno è più portabile di $NF-1
; è decisamente meno ambiguo. $(NF)
è eccessivo, però, basta $NF
. Vale anche la pena proteggersi dalle righe con meno di 2 colonne, poiché con le righe di una colonna si otterrebbe il valore della prima colonna due volte , e con le righe a colonna zero, ovvero vuote, il comando awk fallirebbe del tutto, a causa di un tentativo per accedere a un campo con indice -1.
l'utilizzo di gawk mostra il problema:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Ho appena messo gawk su Solaris 10 M4000: Quindi, gawk è il cuplrit sul problema $ NF-1 contro $ (NF-1). Prossima domanda cosa dice POSIX? per:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
Non c'è direzione in un modo o nell'altro. Non bene. gawk implica sottrazione, altri awk implicano numero di campo o sottrazione. hmm.
$(NF-1)
è che i due esempi di calcolo dell'indice di campo nella specifica utilizzano entrambi quella forma: $(NF-1)
e $(NF+2)
. Poi c'è la sezione "Espressioni in awk", che elenca $expr
come aventi precedenza [molto] più alta di expr - expr
. Poiché NF
è un'espressione stessa, $NF-1
dovrebbe restituire ($NF)-1
. Anche SE, dopo tutto, ci sono davvero implementazioni awk là fuori che valutano $NF-1
come $(NF-1)
, la lezione appresa qui è che l'uso $(NF-1)
è la scelta sicura e portatile.
prova con questo
$ 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% /
Prova questo per tenere conto di tutti i possibili scenari:
awk '{print $(NF-1)"\t"$NF}' file
o
awk 'BEGIN{OFS="\t"}' file
o
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file