2013-08-06 13 views
10

Jak uzyskać maksymalną wartość "rate" i odpowiednią wartość "log2c" z pliku w następujący sposób? np .: maksymalna stawka to 89,5039, a log2c 3,0. wielkie dzięki.jak uzyskać maksymalną liczbę z pliku ze skryptami powłoki bash Linux

log2c=5.0 rate=88.7619 
log2c=-1.0 rate=86.5412 
log2c=11.0 rate=86.1482 
log2c=3.0 rate=89.5039 
log2c=-3.0 rate=85.5614 
log2c=9.0 rate=81.4302 
+1

Czy istnieje powód, dla którego nie robisz tego w Awk? To powinno być trywialne po krótkim tutorialu wprowadzającym. – tripleee

+0

Rozwiązanie devnull doskonale działa w bash. Jednak moja nazwa pliku wejściowego pochodzi od zmiennej $ filename. Tak więc umieszczam te słowa w echo "..." | sh. wybacz mi, jestem nowicjuszem. – Eman

Odpowiedz

12

Zastosowanie sort:

sort -t= -nr -k3 inputfile | head -1 

Dla danego wejścia, że ​​to powrót:

log2c=3.0 rate=89.5039 

Jeśli chcesz odczytać wartości do zmiennych, można skorzystać z wbudowanego read :

$ IFS=$' =' read -a var <<< $(sort -t= -nr -k3 inputfile | head -1) 
$ echo ${var[1]} 
3.0 
$ echo ${var[3]} 
89.5039 
+0

Następnie, jak uzyskać 89.5039 i 3.0, dziękuję. – Eman

+0

@ user79883 patrz edycja powyżej. – devnull

+0

Lub "IFS = $" = "odczyt nieużywanego log2c nieużywanego kursu <<<" $ (sort-t = -nr -k3 plik wejściowy | head -1) "' – anishsane

4

W przypadku bardzo dużych plików używanie numeru sort będzie dość powolne. W tym przypadku lepiej jest użyć czegoś podobnego awk, który potrzebuje tylko jedno hasło:

$ awk -F= 'BEGIN { max = -inf } { if ($3 > max) { max = $3; line = $0 } } END { print line }' test.txt 
log2c=3.0 rate=89.5039 

Złożoność czas tej operacji jest liniowa, a złożoność przestrzeń jest stała (i mały). Objaśnienie:

  1. awk -F= '...' test.txt: Wywołuje awk na Test.txt, używając = jako separator pól
  2. BEGIN { max = -inf }: Initialise max na coś, co zawsze będzie mniejszy niż cokolwiek czytasz.
  3. { if ($3 > max) { max = $3; line = $0; } }: Dla każdej linii wejściowej, jeśli max jest mniejsza niż wartość pola trzeciego ($3), następnie zaktualizować go i zapamiętać wartości bieżącej linii ($0)
  4. END { print line }: Wreszcie drukować linię my zapamiętane podczas odczytu danych wejściowych.
+0

Nie działało na moim linuksie ani na maksa z gawkiem 4.1.4, chyba że zastąpisz "print line" przez "print $ line" –

Powiązane problemy