Сортировка списка сценариев оболочки - PullRequest
2 голосов
/ 02 ноября 2009

У меня есть список со следующим содержанием:

VIP NAME DATE  ARRIVE_TIME FLIGHT_TIME

1  USER1 11-02    20.00    21.00
3  USER2 11-02    20.45    21.45
4  USER2 11-03    20.00    21.30
2  USER1 11-04    17.20    19.10

Я хочу отсортировать этот и подобные списки с помощью сценария оболочки. Результатом должен быть новый список со строками, которые не сталкиваются. VIP 1 является наиболее важным, если любой VIP с большим номером имеет ARRIVE_TIME до FLIGHT_TIME для VIP 1 в ту же дату, эту строку следует удалить, поэтому следует использовать номер VIP, чтобы решить, какие линии оставить, если ARRIVE_TIME, FLIGHT_TIME и DATE сталкиваются. Точно так же VIP 2 важнее VIP 3 и т. Д.

Это довольно продвинутое, и я совершенно лишен идей, как это решить.

Ответы [ 2 ]

2 голосов
/ 02 ноября 2009

Вы можете использовать команду сортировки unix, чтобы сделать это:

Есть пример того, как установить первичные и вторичные ключи и т.д .:

Пример

Команда uniq - это то, что вам нужно для удаления дубликатов.

1 голос
/ 03 ноября 2009

Это может помочь вам начать:

  • Я игнорирую строку заголовка. Вы можете избавиться от него с помощью head или пропустить его в цикле for.
  • Сортировка рейсов по дате, прилету, вылету и номеру vip - использование номера vip в качестве ключа сортировки упрощает логику позже.
  • Я сохраняю результат в массиве, но вы можете перенаправить его во временный файл и читать его по очереди за раз с циклом while read line; do ...; done <tempfile.
  • Я использую косвенное обращение, чтобы сделать вещи более читабельными (называя поля вместо непосредственного использования индексов массива - восклицательный знак здесь означает косвенное обращение вместо «не»)
  • Для каждой строки в результате, которая появляется в ту же дату, что и самая последняя напечатанная строка , сравните время прибытия с временем вылета предыдущего рейса
  • Отобразите соответствующие строки.
  • сохранить дату и время отправления для последующего сравнения.
  • Вы должны настроить < сравнение на <=, если это лучше работает для ваших данных.

Вот сценарий:

#!/bin/bash
saveIFS="$IFS"
IFS=$'\n'
flights=($(sort -k3,3 -k4,4n -k5,5n -k1,1n flights ))
IFS="$saveIFS"

date=fields[2]
arrive=fields[3]
depart=fields[4]

for line in "${flights[@]}"
do
    fields=($line)
    if [[ ${!date} == $prevdate && ${!arrive} < $prevdep ]]
    then
        echo "deleted: $line"    # or you could do something else here
    else
        echo $line
        prevdep=${!depart}
        prevdate=${!date}
    fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...