Создание словаря ... вроде - PullRequest
       2

Создание словаря ... вроде

0 голосов
/ 05 августа 2011

У меня есть следующий набор значений в файле с разделителями табуляции (здесь показана только часть значений ... файл имеет 2 столбца)

MXRA8   9.9074e-08
AURKAIP1    0.0000e+00
CCNL2   1.4962e-07
CCNL2   2.0536e-07
CCNL2   2.5198e-07
CCNL2   2.5311e-07
LOC148413   2.2558e-07
MRPL20  0.0000e+00
LOC441869   0.0000e+00
TMEM88B 0.0000e+00 

Поскольку очевидное значение для CCNL2 встречается 4 раза, чтоЯ хочу, чтобы только самое высокое значение повторяющегося имени в столбце 1 было извлечено и помещено в другой файл.

Примерно так

MXRA8   9.9074e-08 
AURKAIP1    0.0000e+00 
CCNL2   2.5311e-07 
LOC148413   2.2558e-07 
MRPL20  0.0000e+00 
LOC441869   0.0000e+00 
TMEM88B 0.0000e+00 

Любые предложения для сценария сценария bash Shell.

Или один вкладыш в PERL

Ответы [ 3 ]

3 голосов
/ 05 августа 2011

Судя по man-странице сортировки, она обрабатывает значения с плавающей запятой с помощью числовой сортировки, но вы можете захотеть проверить это:

sort --key=2 --general-numeric-sort --reverse input.txt | sort --key=1,1 --unique

AURKAIP1    0.0000e+00
CCNL2   2.5311e-07
LOC148413   2.2558e-07
LOC441869   0.0000e+00
MRPL20  0.0000e+00
MXRA8   9.9074e-08
TMEM88B 0.0000e+00
2 голосов
/ 05 августа 2011

Попробуйте:

awk -F '\t' 'BEGIN { } { if (max[$1] == "" || $2 > max[$1]){ max[$1] = $2 } } END { for (var in max) { print var,"\t",max[var] } } ' tab-limited-data-file

Это должно вывести максимум для каждого значения в первом столбце.

1 голос
/ 05 августа 2011

Вы можете сначала отсортировать, а затем использовать awk, чтобы читать строку за строкой, сохраняя только строку max.Если повторяющиеся строки всегда сгруппированы, как на входе выборки, сортировки можно избежать.

sort file | awk -F '\t' 'NR==1{last = $1; max = 0} {if (last != $1) {printf "%s\t%e\n", last, max; last = $1; max = $2} else if (max < $2) max = $2} END{printf "%s\t%e\n", last, max}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...