Voglio solo stampare le ultime due colonne.
Voglio solo stampare le ultime due colonne.
Risposte:
È possibile utilizzare la variabile NFimpostata 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}' fileo awk '{print $(NF-1), $NF}' fileo 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>field2che è 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) - 1in ogni awkimplementazione.
yaccgrammatica, 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-1e $NF(funziona su Mac OS X 10.6.8 per FreeBSD awke 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 $exprcome aventi precedenza [molto] più alta di expr - expr. Poiché NFè un'espressione stessa, $NF-1dovrebbe restituire ($NF)-1. Anche SE, dopo tutto, ci sono davvero implementazioni awk là fuori che valutano $NF-1come $(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