Вопрос по sorting, bash, shell, unix – Поле сортировки даты в Unix

3

У меня есть текстовый файл, который содержит сотни тысяч записей. Одним из полей является поле даты. Есть ли способ сортировки файла по полю даты?

09-APR-12 04.08.43.632279000 AM
19-MAR-12 03.53.38.189606000 PM
19-MAR-12 03.56.27.933365000 PM
19-MAR-12 04.00.13.387316000 PM
19-MAR-12 04.04.45.168361000 PM
19-MAR-12 03.54.32.595348000 PM
27-MAR-12 10.28.14.797580000 AM
28-MAR-12 12.28.02.652969000 AM
27-MAR-12 07.28.02.828746000 PM

Выход должен прийти как

19-MAR-12 03.53.38.189606000 PM
19-MAR-12 03.54.32.595348000 PM
19-MAR-12 03.56.27.933365000 PM
19-MAR-12 04.00.13.387316000 PM
19-MAR-12 04.04.45.168361000 PM
27-MAR-12 10.28.14.797580000 AM
27-MAR-12 07.28.02.828746000 PM
28-MAR-12 12.28.02.652969000 AM
09-APR-12 04.08.43.632279000 AM

Я пробовал команду сортировки, чтобы упорядочить дату (принимая поле даты в виде строки), но это не дает правильный вывод.

Ваш Ответ

4   ответа
5

Input.txt

09-APR-12 04.08.43.632279000 AM 
19-MAR-12 03.53.38.189606000 PM 
19-MAR-12 03.56.27.933365000 PM 
19-MAR-12 04.00.13.387316000 PM 
19-MAR-12 04.04.45.168361000 PM 
19-MAR-12 03.54.32.595348000 PM 
27-MAR-12 10.28.14.797580000 AM 
28-MAR-12 12.28.02.652969000 AM 
27-MAR-12 07.28.02.828746000 PM 

Code

 sort -t "-"  -k 3 -k 2M -nk 1 Input.txt

Output

19-MAR-12 03.53.38.189606000 PM
19-MAR-12 03.54.32.595348000 PM
19-MAR-12 03.56.27.933365000 PM
19-MAR-12 04.00.13.387316000 PM
19-MAR-12 04.04.45.168361000 PM
27-MAR-12 07.28.02.828746000 PM
27-MAR-12 10.28.14.797580000 AM
28-MAR-12 12.28.02.652969000 AM
09-APR-12 04.08.43.632279000 AM
Это выводы27-MAR-12 07 ... PM до27-MAR-12 10 ... AM.
0

awk '{
  t = gensub(/\.([0-9]{2})\./, ":\\1:", 1, $0);
  command = "date +%s%N -d \x022" t "\x022";
  command | getline t;
  close(command);
  print t, $0;
}' unsorted.txt | sort -n -k 1 | cut -d ' ' -f 2- > sorted.txt
6

27-MAR-12 07.28.02.828746000 PM до27-MAR-12 10.28.14.797580000 AM, Это можно изменить:

sort -t- -k 3.1,3.2 -k 2M -k 1n -k 3.23,3.24

Но это все еще очень хрупко. Было бы намного лучше преобразовать даты в эпоху и сравнить их численно.

+1 О да .. я пропустил это ... спасибо ... :)
+1 специально за совет по переходу на вменяемый формат даты.
0

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

while read a; do   
grep "^${a}" input.txt; 
done < <(sed 's/\./:/;s/\./:/' input.txt | xargs -n3 -I{} date -d"{}" +%s | sort | xargs -n1 -I{} date -d @'{}' +'%d-%^h-%y %I.%M.%S')

Похожие вопросы