Сортировка по нескольким столбцам - PullRequest
1 голос
/ 14 сентября 2011

У меня есть некоторые данные в следующем формате:

1298501934.311 42.048
1298501934.311 60.096
1298501934.311 64.128
1298501934.311 64.839
1298501944.203 28.352
1298501966.283 6.144
1298501972.900 0
1298501972.939 0
1298501972.943 0
1298501972.960 0
1298501972.961 0
1298501972.964 0
1298501973.964 28.636
1298501974.215 27.52
1298501974.407 25.984
1298501974.527 27.072
1298501974.527 31.168
1298501974.591 30.144
1298501974.591 31.296
1298501974.83 27.605
1298501975.804 28.096
1298501976.271 23.879
1298501978.488 25.472
1298501978.744 25.088
1298501978.808 25.088
1298501978.936 26.24
1298501979.123 26.048
1298501980.470 23.75
1298501980.86 17.53
1298501982.392 22.336
1298501990.199 8.064
1298501997.943 0.256
1298501997.943 0.448
1298501997.943 0.512
1298501997.943 5.952
1298501997.946 0.448
1298501997.946 0.576
1298501997.946 5.44

Моя цель - получить максимальное значение из правого столбца для каждого уникального значения в левом столбце.Например, после обработки следующих 4 строк:

1298501997.943 0.256
1298501997.943 0.448
1298501997.943 0.512
1298501997.943 5.952

Я хотел бы получить только последнюю строку,

1298501997.943 5.952

, поскольку "5.952" является наибольшим значением для 1298501997.943

Аналогично для следующих строк:

1298501997.946 0.448
1298501997.946 0.576
1298501997.946 5.44

Я бы хотел получить:

1298501997.946 5.44

А для:

1298501990.199 8.064

просто:

1298501990.199 8.064

и так далее ...

Я пытался найти некоторые подсказки в awk / uniq / etc., Но не знал даже, как сформулировать запрос.Я мог бы написать скрипт на Python, но мне кажется, что работа с awk или некоторыми другими стандартными инструментами была бы более эффективной (особенно если у меня много данных - миллионы / десятки миллионов строк).

PS:Есть ли какой-нибудь модуль Python для таких сценариев обработки текста?

Спасибо

Ответы [ 5 ]

2 голосов
/ 14 сентября 2011

Вы можете поместить его в Excel (импортируя его, разделив символ пробела) и отсортировав его таким образом.Это довольно грубое решение, но оно простое.

1 голос
/ 14 сентября 2011

Использование awk:

{
    if (array[$1] < $2)
        array[$1]=$2
}
END {
    printf("%-20s%s\n", "Value", "Max")
    printf("%-20s%s\n", "-----", "---")
    for (i in array)
        printf("%-20s%s\n", i, array[i])
}

Вывод:

$ awk -f sort.awk log 
Value               Max
-----               ---
1298501980.86       17.53
1298501978.808      25.088
1298501974.215      27.52
1298501973.964      28.636
1298501979.123      26.048
1298501978.936      26.24
1298501975.804      28.096
1298501972.964      
1298501944.203      28.352
1298501974.83       27.605
1298501974.407      25.984
1298501997.943      5.952    <---- as in your example
1298501978.488      25.472
1298501972.939      
1298501972.900      
1298501982.392      22.336
1298501974.527      31.168
1298501997.946      5.44     <---- as in your example
1298501980.470      23.75
1298501974.591      31.296
1298501990.199      8.064    <---- as in your example
1298501966.283      6.144
1298501934.311      64.839
1298501976.271      23.879
1298501972.960      
1298501978.744      25.088
1298501972.961      
1298501972.943      
0 голосов
/ 15 сентября 2011

В качестве однострочной оболочки (используется аргумент -f uniq, который игнорирует первый n столбцов; чтобы игнорировать второй, столбцы меняются местами дважды)

cat yourData | sort -g | awk '{print $2,$1};'  | uniq -f1 | awk '{print $2,$1};'
0 голосов
/ 14 сентября 2011

Я сомневаюсь, что Python будет значительно менее эффективен, чем другие инструменты (если вам не нужно обрабатывать миллионы данных каждую долю секунды).Вы можете сделать что-то вроде этого:

import sys
d={}
for l in open(sys.argv[1]):
    a,b=[float(item) for item in l.split()]
    d[a]=max(d.get(a,b),b)
 for a in d: print a,d[a]

и запустить его с

$ python script.py dataFile
0 голосов
/ 14 сентября 2011

Простой sort -g делает свое дело.Это общая числовая сортировка, которая может обрабатывать пробелы.

...