Вид с помощью пользовательского шаблона

Что касается Red Hat, это отличается от других дистрибутивов Linux, потому что это используется главным образом на стороне сервера Предприятиями. В этом случае Предприятиям нужны полная поддержка и системные обновления для Red Hat, потому что его работа их рабочих серверов и таких крупных предприятий не выполнила бы неподдерживаемые системы, это - то, для каких большинства зарядов Red Hat на самом деле.

5
12.05.2013, 14:14
3 ответа

Необходимо было бы использовать что-то большее чем просто sort команда. Сначала grep b строки, затем d строки и затем сортируют что-либо без b или d в конце этого.

grep '^b' myfile > outfile
grep '^d' myfile >> outfile
grep -v '^b' myfile | grep -v '^d' | sort >> outfile
cat outfile

приведет к:

b
d
a
c

Это предполагает, что строки запускаются с 'шаблона' b и d если это - целый шаблон, или что-то в строке можно не учесть каре (^)

Короткий эквивалент был бы:

(grep '^b' myfile ; grep '^d' myfile ; grep -v '^b' myfile | grep -v '^d' | sort)
5
27.01.2020, 20:31
  • 1
    Этот метод работает, но он может быть пересмотрен в остроту что только выводы к STDOUT вместо того, чтобы писать в файл в блоках? –  Sergey Lukin 12.05.2013, 14:45
  • 2
    @Sergey Просто не использует перенаправления. –  Rany Albeg Wein 12.05.2013, 15:07
  • 3
    я вижу, таким образом: grep '^b' myfile; grep '^d' myfile; кошка myfile | grep-v '^b' | grep-v '^d' | вид –  Sergey Lukin 12.05.2013, 15:20
  • 4
    @Sergey Вы хотели бы приложить материал в ( и ) иначе Вы не можете перенаправить объединенный вывод –  Anthon 12.05.2013, 15:52
  • 5
    Да, также я вижу это cat было ненужным, Спасибо! я думаю, что мы немного сокрушили только совершенно рабочая острота. Мы можем использовать awk сделать это более эффективным? –  Sergey Lukin 12.05.2013, 16:13

Когда Вам нужны данные, которые будут отсортированы вне sortвозможность, общий подход должен предварительно обработать данные, чтобы предварительно ожидать ключ сортировки, затем вид, и наконец удалить дополнительный ключ сортировки. Например, здесь, добавьте a 0 если строка запускается с b, a 1 если строка запускается с d, и a 2 иначе.

sed -e 's/^b/0&/' -e t -e 's/^d/1&/' -e 't' -e 's/^/2/' |
sort |
sed 's/^.//'

Обратите внимание, что это сортирует весь b и d строки. Если Вы хотите эти строки в первоначальном заказе, то самый легкий подход должен отделить строки, которые Вы хотите оставить неотсортированным. Можно, однако, работать исходная строка в ключ сортировки с nl — но здесь это более сложно. (Замена \t литеральным символом табуляции повсюду, если Ваш sed не понимает тот синтаксис.)

nl -ba -nln |
sed 's/^[0-9]* *\t\([bd]\)/\1\t&/; t; s/^[0-9]* *\t/z\t0\t/' |
sort -k1,1 -k2,2n |
sed 's/^[^\t]*\t[^\t]*\t//'

С другой стороны, используйте язык, такой как Perl, Python или Ruby, который позволяет Вам легко указать пользовательскую функцию вида.

perl -e 'print sort {($b =~ /^[bd]/) - ($a =~ /^[bd]/) ||
                     $a cmp $b} <>'
python -c 'import sys; sys.stdout.write(sorted(sys.stdin.readlines(), key=lambda s: (0 if s[0]=="b" else 1 if s[0]=="d" else 2), s))'

или если Вы хотите уехать b и d строки в первоначальном заказе:

perl -e 'while (<>) {push @{/^b/ ? \@b : /^d/ ? \@d : \@other}, $_}
         print @b, @d, sort @other'
python -c 'import sys
b = []; d = []; other = []
for line in sys.stdin.readlines():
    if line[0]=="b": b += line
    elif line[0]=="d": d += line
    else: other += line
other.sort()
sys.stdout.writelines(b); sys.stdout.writelines(d); sys.stdout.writelines(other)'
14
27.01.2020, 20:31
  • 1
    Идея предварительно обработать обещание звуков, однако ни один из Ваших sed примеров действительно не работает на меня –  Sergey Lukin 13.05.2013, 10:54
  • 2
    Второй sed пример не имел смысла, и я зафиксировал его, но первые работы для меня. Что случилось с ним? –  Gilles 'SO- stop being evil' 14.05.2013, 00:55
  • 3
    С первым примером я получаю ошибку когда t; внутри, когда я заменяю t с \t, литеральная вкладка или снимает его, я получаю следующий вывод: 0b\n 1d\n a\n c\n который близок, но b и d оставлены с целыми числами –  Sergey Lukin 14.05.2013, 20:59
  • 4
    @Sergey, Вы, должно быть, скопировали код неправильно. Первым sed примером является отличное и эффективное решение этой проблемы. Просто скопируйте и вставьте первый пример в свой терминал, введите в строках a, b, c, d, и затем управляйте-d для наблюдения вывода. Помогло бы, можно ли сказать нам содержание сообщения об ошибке. Это кажется, что у Вас есть недостающая кавычка или другой синтаксис. –  RobertL 26.10.2015, 07:21
  • 5
    @RobertL, Таким образом, я понял это. Я добираюсь sed: 1: "s/^b/0&/; t; s/^d/1&/; ...": undefined label '; s/^d/1&/; t; s/^/2/' на версии BSD SED (используемый по умолчанию на FreeBSD и OS X), однако это действительно работает превосходное над GNU SED 4.2.2 –  Sergey Lukin 27.10.2015, 17:05

Один способ решить это использование awk был бы:

sort myfile | awk '$0 ~ /^b/ || $0 ~ /^d/ {print} $0 !~ /^b/ && $0 !~ /^d/ { a[f++] = $0 } END { for (word = 0; word < f; word++) { print a[word] } }'
4
27.01.2020, 20:31
  • 1
    +1, Вы попробовали, если это работает быстрее, чем (несколько) grep вызовы? –  Anthon 12.05.2013, 17:28
  • 2
    @Anthon Да, согласно моим результатам метод AWK работает в среднем числе в 2 раза быстрее. Проверьте эту суть для деталей: gist.github.com/sergeylukin/5564524 –  Sergey Lukin 12.05.2013, 21:57

Теги

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