trova il valore massimo della colonna 1 e stampa il rispettivo record dalla colonna 2 dal file


19

Come trovare il valore massimo dalla colonna 1 ed eseguire l'eco della rispettiva posizione del percorso da un file che contiene n numero di record.

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0

Uscita prevista:

/opt/oracle/app/oracle/product/12.1.0

Risposte:


23

Questo dovrebbe funzionare:

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

Le -v max=0imposta la variabile maxa 0, quindi, per ogni linea, il primo campo viene confrontato con il valore corrente di max. Se è maggiore, maxè impostato sul valore del 1 ° campo ed wantè impostato sulla riga corrente. Quando il programma ha elaborato l'intero file, wantviene stampato il valore corrente di .

modificare

Non ho testato la awksoluzione prima ed è stato davvero un peccato averla fornita. Ad ogni modo, la versione modificata della risposta dovrebbe funzionare (grazie a terdon per averlo corretto) e ho testato anche il seguito.

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

Sono sortsul primo campo in cui,

  • -n specifica l'ordinamento numerico.
  • -r specifica invertire il risultato dell'ordinamento.
  • -k1,1 specifica il primo campo per l'ordinamento.

Ora, dopo l'ordinamento, sto eseguendo il piping dell'output e sto solo ottenendo il primo risultato che mi darà il valore numericamente più alto di column1 nel risultato.

Ora, infine, lo installo cutcon il delimitatore specificato come spazio e stampando l' -f3output desiderato.

analisi

cat filename
112030   /opt/oracle/app/oracle/product/11.2.0
121010   /opt/oracle/app/oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

Ora, dopo aver eseguito il comando precedente per l'input come sopra, ottengo l'output come,

/Max/number

awk max non confronta numericamente il campo stringa. è per questo che hai dato un secondo approccio?
— Sajuuk,

7

Puoi farlo con AWK.

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/oracle/app/oracle/product/12.1.0

Qui la prima colonna di ogni riga viene confrontata con la variabile max(che inizialmente è 0). Se la prima colonna ha un valore maggiore che maxla seconda colonna è memorizzata nella variabile line, questo continua per ogni riga del file.

Alla fine della ENDregola del file viene eseguita per stampare la linevariabile.


4
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log

3

sort -k1 -n filename | tail -1 | awk '{print $2}'


1
Questo dovrebbe funzionare ma è inefficiente, perché l'ordinamento è eccessivo quando l'attività deve trovare il massimo.
— jw013,

2

Semplicemente puoi ordinarlo usando il sortcomando

sort -r version.log | head -n1 | awk '{print $2}'

Produzione:

/opt/oracle/app/oracle/product/12.1.0

si desidera stampare il secondo valore solo provare questo cat version.log | ordina -r | head -n1 | awk -F "" '{Stampa $ 2}'
— Security Beast il

Ti preghiamo di non pubblicare schermate del tuo terminale. Basta incollare il testo invece. Inoltre, non è necessario cat, l'ordinamento può prendere direttamente i file di input.
— terdon

-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’

2
Sembra una ri-hash della risposta accettata? Per favore, spiega in che modo differisce.
— Stephen Rauch,

Anzi, per lo meno dare credito all'autore originale.
— Jeff Schaller
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.