2014-01-15 3 views
0

Как бы вы выполняли сортировку Unix только во внутреннем столбце?Unix случайная сортировка только по внутреннему ключу/столбцу

Следующее утверждение представляется разумным, но оно неожиданно забывает о первом шаге рандомизации: он выдает тот же результат при повторении.

$ sort --random-sort test.txt | sort --key=2,2 
1 a 2 
2 a 1 
1 b 2 
2 b 1 

Кстати, мой интерес в конечном счете создать стратифицированные случайные выборки (которые первый требует рандомизации и группировка).

ответ

1

Если вы хотите, чтобы некоторые случайности остаться, вам нужно добавить опцию --stable на второго рода:

$ sort --random-sort test.txt | sort --key=2,2 --stable 
2 a 1 
1 a 2 
1 b 2 
2 b 1 
$ sort --random-sort test.txt | sort --key=2,2 --stable 
1 a 2 
2 a 1 
1 b 2 
2 b 1 

Это документируется gnu.org:

Пара строк сравнивается следует: сортировка сравнивает каждую пару полей в порядке, указанном в командной строке, в соответствии с связанными параметрами порядка до тех пор, пока не будет найдена разница или не останется полей . Если ключевые поля не заданы, сортировка использует по умолчанию ключ всей строки. Наконец, в крайнем случае, когда все ключи сравниваются с , сортировка сравнивает целые строки, как если бы не были указаны параметры заказа, отличные от --reverse (-r). Параметр -stable (-s) отключает это сравнение последнего курорта, так что строки, в которых все поля сравниваются, равны , остаются в исходном относительном порядке. Опция -unique (-u) также отключает сравнение последнего курорта.

Другими словами, в вашем случае, если две строки сравнить же под ключ = 2,2, sort, по умолчанию, игнорировать ваш ключ выбора и сравнить всю линию. Указывая --stable, поведение по умолчанию подавляется, и исходный порядок сохраняется для этих строк.

Смежные вопросы