Распечатайте нечетные строки, распечатайте четные строки

Вы могли попробовать драйвер ATI с закрытым исходным кодом (именно это я в конечном счете сделал :-(), Но там я должен был увеличить Виртуальное разрешение для получения работы большого экрана.

Section "Screen"
        Identifier "aticonfig-Screen[0]-0"
        Device     "aticonfig-Device[0]-0"
        Monitor    "aticonfig-Monitor[0]-0"
        DefaultDepth     24
        SubSection "Display"
                Viewport   0 0
                Virtual 3046 1200
                Depth     24
        EndSubSection
EndSection

Я хотел иметь синхронизацию к vblank на моем выводе HDMI, и я не мог найти способ сделать это с драйверами с открытым исходным кодом. Вот почему я в конечном счете перешел к испорченным.

18
26.10.2015, 11:54
7 ответов

Поскольку Вы спросили “в одной строке”:

awk '{print>sprintf("%sfile.%d",NR%2?"odd":"even",PROCINFO["pid"])}' filename

Обратите внимание, что большая часть кода происходит из-за Вашего необычного выходного выбора имени файла. Иначе следующего кода было бы достаточно для помещения нечетных строк в “строку 1” и даже строки в “строке 0”:

awk '{print>"line-"NR%2}' filename
12
27.01.2020, 19:45

Это легко:

 sed -n 2~2p filename

распечатает четные строки от имени файла

sed -n 1~2p filename

распечатает нечетные строки.

14
27.01.2020, 19:45
  • 1
    +1, для того, чтобы не использовать AWK посторонним образом. Не POSIX sed, но это - все еще основательный метод. –  J. M. Becker 01.11.2012, 16:33
  • 2
    @TechZilla я не понимаю "использование AWK посторонним образом" - awk, является POSIX также. спасибо –  jw013 01.11.2012, 17:31
  • 3
    @jw013: Ничто не неправильно с awk, лично я использую его очень часто. Я никогда не говорил, что что-либо было 'Не POSIX' о awk, Я обращался к ответу sed опции. Конкретно ~ оператор, это - расширение GNU, которое все еще приемлемо для многих людей. Относительно 'использования AWK посторонним образом, I personally believe using awk' для этой простой задачи является излишеством. Так эти +1 был для для того, чтобы выполнить задачу с sed, более легкая утилита, чем awk. –  J. M. Becker 01.11.2012, 17:55
  • 4
    , кто-то может объяснить, как ~ оператор работает здесь? –  Forever Learner 10.04.2018, 18:51

Попробуйте это:

awk '{if(NR%2){print $0 > "odd.file"}else{print $0 > "even.file"}}' filename
0
27.01.2020, 19:45
  • 1
    Вы уверены в выводе рекордных чисел? –  manatwork 13.12.2011, 14:17
  • 2
    извините, о который, я изменил его для вывода целых строк. –  renma 13.12.2011, 14:29

Я предпочитаю быть совместимым POSIX, когда это возможно, таким образом, я думал, что отправлю этот альтернативный метод. Я часто использую их для искажения текста, прежде xargs конвейеры.

Распечатайте четные строки,

sed -n 'n;p'

Распечатайте нечетные строки,

sed -n 'p;n'

Хотя я часто использую awk, это - излишество для этого типа задачи.

26
27.01.2020, 19:45

Вы можете сделать это с помощью одного вызова sed , не нужно читать файл дважды:

sed '$!n
w even
d' infile > odd

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

sed -e '$!n' -e 'w even' -e d infile > odd

Обратите внимание, что это не даст ожидаемый результат, если файл содержит только одну строку (строка будет иметь вид w , преобразованный в четный вместо нечетный в качестве первого n isn не выполнено). Чтобы этого избежать, добавьте условие:

sed -e '$!n' -e '1!{w even' -e 'd}' infile > odd

Как это работает? Ну, он использует три команды sed :
n - если не в последней строке , выведите пространство шаблонов на stdout (который перенаправляется в файл odd ), замените его следующей строкой (теперь она обрабатывает четную строку) и продолжите выполнение оставшихся команд
w - добавить пространство шаблонов в файл even
d - удалить текущее пространство шаблонов и перезапустить цикл - побочным эффектом этого является то, что sed никогда не будет автоматически печатать пространство шаблонов, поскольку он никогда не достигает конца скрипта

Другими словами, n выполняется только на нечетных строках, а w и d выполняются только на четных строках. sed никогда не выполняет автопечать, если, как я уже сказал, ввод не состоит из одной строки.

2
27.01.2020, 19:45

Для четных чисел код должен быть

awk 'NR%2==0' filename

& для нечетных чисел

awk 'NR%2==1' filename
9
27.01.2020, 19:45

Я бы выбрал perl , потому что мне нравится perl :

perl -pe 'BEGIN{open($e,">even_lines");open($o,">odd_lines")} $. % 2 ?select $o:select $e;'

Использует тот факт, что -p неявно печатает, чтобы воспроизвести, как sed работает - и мы используем select , чтобы выбрать дескриптор файла, в который он записывает.

0
27.01.2020, 19:45

Теги

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