помощь в сортировке файла с помощью сортировки - PullRequest
3 голосов
/ 28 мая 2011

У меня есть этот файл:

100: pattern1
++++++++++++++++++++
1:pattern2
9:pattern2
+++++++++++++++++++
79: pattern1
61: pattern1
+++++++++++++++++++

и я хочу отсортировать это так:

++++++++++++++++++++
1:pattern2
9:pattern2
+++++++++++++++++++
61:pattern1
79:pattern1
100:pattern1
+++++++++++++++++++

Возможно ли использовать только команду сортировки Linux?

Если бы у меня было:

4:pat1 
3:pat2
2:pat2
1:pat1

O / p должно быть:

1:pat1
++++++++++++ 
2:pat2
3:pat2
++++++++++++
4:pat1

Итак, хотите отсортировать по первой группе, но «группа» по шаблону второй группы. Обратите внимание, что после: шаблон регулярных выражений, а не литерал.

Ответы [ 4 ]

1 голос
/ 28 мая 2011

Лучшее, что вы можете сделать, это отсортировать его по числовым значениям.Но вы не можете ничего сделать со строкой «+».

$ sort -n input
+++++++++++++++++++
+++++++++++++++++++
++++++++++++++++++++
1:wow
9:wow
61: this is it
79: this is it
100: this is it
0 голосов
/ 29 мая 2011

Я не верю, sort один может сделать то, что вам нужно.

Создайте новый сценарий оболочки и поместите его в его содержимое (т.е. mysort.sh):

#!/bin/sh
IFS=$'\n' # This makes the for loop below split on newline instead of whitespace.
delim=+++++++++++++++++++
for l in `grep -v ^+| sort -g`      # Ignore all + lines and sort by number
do
    current=`echo $l | sed s/^[0-9]*://g` # Get what comes after the number
    if [ ! -z "$prev" ] && [ "$prev" != "$current" ] # If it has changed...
    then                                  #  then output a ++++ delimiter line.
        echo $delim
    fi
    prev=$current
    echo $l                               # Output this line.
done

Чтобы использовать его, передайте содержимое вашего файла так:

cat input | sh mysort.sh
0 голосов
/ 29 мая 2011

Если ваш ввод был разделен пробелом, а не разделителем ':':

sort  -rk2 | uniq -D -f1

сделает группировку;

  • Полагаю, вам нужно будет отсортировать «подразделы» позже (к сожалению, мой sort(1) не выполняет упорядочение составных ключей. Я верю, что есть версия, которая позволяет вам делать sort -k2,1n, и все будет готово сразу).
  • используйте --all-repeated=separate вместо -D, чтобы получить пустые разделители между группами. Посмотрите на man uniq для большего количества идей!

Однако, поскольку ваш ввод разделен двоеточиями, требуется взлом:

sed 's/\([0123456789]\+\):/\1 /' t | sort  -rk2 | uniq -D -f1

НТН

0 голосов
/ 28 мая 2011

Вероятно, нет - это не тот формат, который sort (1) ожидает. И если бы вы это сделали, это был бы один из тех удивительных хаков, которые нелегко использовать. Если у вас есть какое-то правило для того, что идет между строк со знаком плюс, вы можете сделать это достаточно легко с помощью сценариев AWK, Perl или Python.

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