2013-06-27 3 views
0

У меня есть каталог с файлами соответствующих шаблона имени A-B.diff, где A и B являются числами, например:сортировать и выбирать линии с максимальным значением

100885-40843.diff 
100885-41535.diff 
100886-40500.diff 
101036-41762.diff 
101036-42346.diff 
101038-42010.diff 
101038-42127.diff 
101038-43258.diff 
101038-43873.diff 

Я хотел бы получить список этих файлов, соответствующих ниже критерии:

  • для каждого A есть только один файл
  • B имеет максимальное значение доступного для данного A

Таким образом, для заданных файлов в списке должны быть:

100885-41535.diff 
100886-40500.diff 
101036-42346.diff 
101038-43873.diff 
+0

Используйте 'sort' для сортировки списка и' awk', чтобы выбрать одну строку на A. – Barmar

ответ

1

Если хранить данные в файле, это делает его:

$ awk -F"[-.]" '{if ($2 > a[$1]) a[$1]=$2} END{for (i in a) printf "%s-%s.diff\n",i, a[i]}' file 
100885-41535.diff 
100886-40500.diff 
101036-42346.diff 
101038-43873.diff 

перебирает список файлов, создающих массив с a[1st part] = biggest 2nd part.

+1

Awesome! Блестящее решение. Именно то, что я искал. Спасибо –

3

Один из способов использования sort и uniq является

sort -t- -r -k2 | sort -t- -rs | uniq -w6 

-t- устанавливает разделитель быть знаком минус, -k2 выбирает второй столбец для сортировки, -r сорта из величайших наименее, и -s сил рода в быть стабильным. Затем uniq -w6 совпадает с uniq (выберите уникальные строки из отсортированного списка), за исключением того, что он проверяет только первые шесть символов. После выполнения этой команды строки сортируются по A и по B, а для каждого A его первое вхождение имеет максимальный B, поэтому uniq выбирает эту строку. На ввод данных, это показывает вывод

101038-43873.diff 
101036-42346.diff 
100886-40500.diff 
100885-41535.diff 

Я полагаю, что если вы хотите, чтобы список в своем естественном порядке можно добавить запись другого sort -n (сортировка по номеру).

+1

+1. Обратите внимание, что вы можете уменьшить это до 'sort -k1,1n -k2,2nr -t- | uniq -w6' – iruvar