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.