множественная сортировка с разным порядком - PullRequest
2 голосов
/ 22 октября 2011

У меня есть такие данные

HOS05 23/12/2008 10AM  
HOS06 15/12/2008 2PM  
HOS62 29/12/2008 10AM  
HOS64 23/12/2008 2PM  
HOS70 26/12/2008 10AM  
ZFT01 06/12/2008 10AM  
HOS73 11/12/2008 2PM  
MHOS0 05/12/2008 10AM  
MHOS0 20/12/2008 2PM  
MHOS0 27/12/2010 2PM  
MHOS0 11/12/2008 10AM  
MHOS0 30/12/2009 2PM
      ^^    ^^^^

Я должен отсортировать по двум смещениям, которые обозначены ^ с.

Первое выделенное смещение должно быть отсортировано в порядке ASC, а затем второе выделено в порядке DESC. Так что я сделал это

sort -k 1.6,1.8 date.txt  | sort -k 1.14,1.17 -r > final.txt

выход: * +1010 *

MHOS0 27/12/2010 2PM  
MHOS0 30/12/2009 2PM  
ZFT01 06/12/2008 10AM  
MHOS0 20/12/2008 2PM
MHOS0 11/12/2008 10AM
MHOS0 05/12/2008 10AM
HOS73 11/12/2008 2PM
HOS70 26/12/2008 10AM
HOS64 23/12/2008 2PM
HOS62 29/12/2008 10AM
HOS06 15/12/2008 2PM
HOS05 23/12/2008 10AM

Это работает нормально, но мне нужно в одной команде сортировки. Есть предложения?

Ответы [ 2 ]

2 голосов
/ 22 октября 2011

Я нашел этот сочный лакомый кусочек на странице руководства:

POS is F[.C][OPTS], where F is the field number and C the character position in the field;  both
   are  origin  1.   If  neither -t nor -b is in effect, characters in a field are counted from the
   beginning of the preceding whitespace.  OPTS is one  or  more  single-letter  ordering  options,
   which override global ordering options for that key.  If no key is given, use the entire line as
   the key.

И вот первый дубль:

sort -k 1.6,1.8 date.txt |sort -k 1.14,1.17 -r

Как насчет:

sort  -k 2.7r,2.10 -k 2.1,2.2 date.txt

Помните [*], поля разделены пробелами и отсчитываются от 1, поэтому ваше поле датыэто поле 2.

[*] Не запомните это!Я риторический.Просто прочитайте man-страницу, когда используете незнакомую команду.Пронумерованные поля - одна из деталей, которые сильно различаются в разных командах.

1 голос
/ 22 октября 2011

Я не знаю, как добиться этого с помощью одной sort команды.Когда мне нужно решить проблему такого типа, я использую скрипт perl.Нечто подобное следующему простому сценарию сделает вашу работу за вас (и даст вам возможность сортировать по любым полям, в которых вы хотите, в любом порядке):

#!/usr/bin/perl

@lines = ();
while (<>) { push(@lines, $_); }

@sorted = sort {
  $a1 = substr($a, 0, 6);
  $ayear = substr($a, 12, 4);
  $b1 = substr($b, 0, 6);
  $byear = substr($b, 12, 4);
  if ($ayear == $byear) { return $b1 cmp $a1; }
  else { return $byear cmp $ayear; }
} @lines;

print @sorted;

, а затем, конечно,

$ perl sorter.perl < data.txt

Документация perl sort находится по адресу http://perldoc.perl.org/functions/sort.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...