как сортировать по дню недели?

Вы устанавливаете nginx из non-debian репозитория, но это требует библиотек в более поздней версии, чем Вы установили, которые также не доступны в debian репозиториях (для сжатия, потому что они - хрипящие версии).

Ваша запись,

deb http://packages.dotdeb.org stable all

дает Вам Хрипящие версии, с тех пор stable=wheezy. Необходимо или переместить все в Хрипящий, или использование, oldstable вместо конюшни. (На самом деле лучше придерживаться имен выпуска как сжатие, а не стабильный в эти дни).

4
21.04.2015, 00:50
2 ответа

Вот еще один способ сделать это (короткая версия, без временных файлов):

{ printf %s\\n "Name On-Call Phone"; 
join -a1 -j2 -o 1.1 2.1 1.2 2.3 -e "Nobody" \
<(printf %s\\n '5 Friday' '1 Monday' '6 Saturday' '7 Sunday' '4 Thursday' '2 Tuesday' '3 Wednesday') \
<(join <(sort file2) <(sort file1) | sort -k2) | sort -k2n | sort -k1n | \
cut -d' ' -f 2-; } | column -t

Если вы абсолютно нуждаетесь в имена дней в CAPS, то:

{ printf %s\\n "Name On-Call Phone";  join -a1 -j2 -o 1.1 2.1 1.3 2.3 -e "Nobody" <(cat <<IN
5 Friday FRIDAY
1 Monday MONDAY
6 Saturday SATURDAY
7 Sunday SUNDAY
4 Thursday THURSDAY
2 Tuesday TUESDAY
3 Wednesday WEDNESDAY
IN
) <(join <(sort file2) <(sort file1) | sort -k2) | sort -k2n | sort -k1n | cut -d' ' -f 2-; } | column -t

Длинная версия:
Скажем, у нас есть два файла, File1 :

Dave 734.838.9800
Bob 313.123.4567
Carol 248.344.5576
Mary 313.449.1390
Ted 248.496.2204
Alice 616.556.4458
Jimmy 324.555.8867
Harry 422.858.2354
Lou 788.907.6859

и file2 :

Bob Tuesday
Carol Monday
Jimmy Wednesday
Ted Sunday
Alice Wednesday
Dave Thursday
Harry Monday
Mary Saturday
Lou Sunday

мы создаем file3 со следующим содержимым:

1 Monday MONDAY
2 Tuesday TUESDAY
3 Wednesday WEDNESDAY
4 Thursday THURSDAY
5 Friday FRIDAY
6 Saturday SATURDAY
7 Sunday SUNDAY

, а затем запуска :

{ printf %s\\n "Name On-Call Phone"; \
join <(sort file2) <(sort file1) | sort -k2 | \
join -a1 -j2 -o 1.1 2.1 1.3 2.3 -e "Nobody" <(sort -k2 file3) - \
| sort -k1n | cut -d' ' -f 2-; } | column -t

или, в одной строке:

{ printf %s\\n "Name On-Call Phone"; join <(sort file2) <(sort file1) | sort -k2 | join -a1 -j2 -o 1.1 2.1 1.3 2.3 -e "Nobody" <(sort -k2 file3) - | sort -k1n | cut -d' ' -f 2-; } | column -t

Выход:

Name    On-Call    Phone
Carol   MONDAY     248.344.5576
Harry   MONDAY     422.858.2354
Bob     TUESDAY    313.123.4567
Alice   WEDNESDAY  616.556.4458
Jimmy   WEDNESDAY  324.555.8867
Dave    THURSDAY   734.838.9800
Nobody  FRIDAY     Nobody
Mary    SATURDAY   313.449.1390
Lou     SUNDAY     788.907.6859
Ted     SUNDAY     248.496.2204

Как это работает:
Присоединяйтесь к <(сортировать файл2) <(сортировать файл1) | Сортировать -k2 - первые два файла присоединяются на основе второго поля, то выход отсортирован по второму столбцу:

Carol Monday 248.344.5576
Harry Monday 422.858.2354
Mary Saturday 313.449.1390
Ted Sunday 248.496.2204
Lou Sunday 788.907.6859
Dave Thursday 734.838.9800
Bob Tuesday 313.123.4567
Jimmy Wednesday 324.555.8867
Alice Wednesday 616.556.4458

Это трубопровод к присоединиться к -a1 -J2 -O 1.1 2.1 1.3 2.3 -E » Никто не "<(sort -k2 file3) - для присоединения к нему file3 на основе второго поля; -A1 добавляет непревзойденные линии из file3 на выходные данные и -E «никто» заменяет недостающие выводы с «никто» :

5 Nobody FRIDAY Nobody
1 Carol MONDAY 248.344.5576
1 Harry MONDAY 422.858.2354
6 Mary SATURDAY 313.449.1390
7 Ted SUNDAY 248.496.2204
7 Lou SUNDAY 788.907.6859
4 Dave THURSDAY 734.838.9800
2 Bob TUESDAY 313.123.4567
3 Jimmy WEDNESDAY 324.555.8867
3 Alice WEDNESDAY 616.556.4458

Результат труба снова на Сортировать -k1n | Вырезать -D '-F 2- , чтобы численно сортировать вывод на 1-м полем, а затем удалить 1-е поле:

Carol MONDAY 248.344.5576
Harry MONDAY 422.858.2354
Bob TUESDAY 313.123.4567
Alice WEDNESDAY 616.556.4458
Jimmy WEDNESDAY 324.555.8867
Dave THURSDAY 734.838.9800
Nobody FRIDAY Nobody
Mary SATURDAY 313.449.1390
Lou SUNDAY 788.907.6859
Ted SUNDAY 248.496.2204

Так как это было сгруппировано {...} с Printf % s \\ n "name on-call Phone" , который печатает заголовок, весь выходной вывод затем питается к столбцу -T , чтобы привести к этому.


Вы можете пропустить один сортировка , если файл3 уже отсортирован на 2-й столбеле (например, на этот раз с простым файлом двух столбцов3):

5 Friday
1 Monday
6 Saturday
7 Sunday
4 Thursday
2 Tuesday
3 Wednesday

, а также назначьте номер телефона на ", например, SED S / NOWOODE / 888 000.8888 / 2 ':

{ printf %s\\n "Name On-Call Phone"; join <(sort file2) <(sort file1) | \
sort -k2 | join -a1 -j2 -o 1.1 2.1 1.2 2.3 -e "Nobody" file3 - | sort -k1n | \
cut -d' ' -f 2-; } | sed 's/Nobody/888.000.8888/2' | column -t

Выход:

Name    On-Call    Phone
Carol   Monday     248.344.5576
Harry   Monday     422.858.2354
Bob     Tuesday    313.123.4567
Alice   Wednesday  616.556.4458
Jimmy   Wednesday  324.555.8867
Dave    Thursday   734.838.9800
Nobody  Friday     888.000.8888
Mary    Saturday   313.449.1390
Lou     Sunday     788.907.6859
Ted     Sunday     248.496.2204
5
27.01.2020, 20:49
awk '
    BEGIN {
        print "Name On-Call Phone"
        split("MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY", days);
    }
    NR == FNR { day[$1] = $2; next }
    { lines[toupper(day[$1])] = $1 OFS toupper(day[$1]) OFS $2 }
    END {
        for (i=1; i<=7; i++) {
            if (lines[days[i]]) 
                print lines[days[i]]
            else
                print "Nobody", days[i]
        }
    }
' file2 file1 | column -t
Name    On-Call    Phone
Carol   MONDAY     248.344.5576
Bob     TUESDAY    313.123.4567
Alice   WEDNESDAY  616.556.4458
Dave    THURSDAY   734.838.9800
Nobody  FRIDAY
Mary    SATURDAY   313.449.1390
Ted     SUNDAY     248.496.2204
3
27.01.2020, 20:49

Теги

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