perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_. $var if $.%3==0' input.txt
Идея здесь в том, что мы используем оператор по модулю %
с переменной номер строки $.
, чтобы выяснить, какая из них является каждой первой, какая — каждой второй, а какая — каждой третьей строкой. Для каждой 3-й строки остаток равен 0, а для каждой 1-й и 2-й строки будут соответствующие числа.
Тест:
$ cat input.txt
gi_1234
My cat is blue.
I have a cat.
gi_5678
My dog is orange.
I also have a dog.
$ perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_. $var if $.%3==0' input.txt
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.
Подход с сохранением второй строки в переменной имеет изъян. Что, если последняя строка является «второй», т.е. для этого номера строки остаток равен 2 ? Исходный код в моем ответе и ответе DopeGhoti не будет печатать My dog is orange
, если мы опустим последнюю строку. Исправление для этого в обоих случаях заключается в использовании блока кода END{}
со сбросом временной переменной после печати. Другими словами:
$ awk 'NR%3 == 1 { print } NR%3 == 2 { delay=$0 } NR%3 == 0 { print; print delay;delay=""}END{print delay}' input.txt
и
$ perl -ne '$s=$_ if $.%3==2;print $_. $s and $s="" if $.%3==0 or $.%3==1;END{print $s}' input.txt
Таким образом, код будет работать для произвольного количества строк в файле, а не только для тех, которые делятся на 3.
В случае awk, если последняя строка в файле выводит 1 вместо $. % 3, в предыдущем коде возникла проблема с выводом пустой новой строки из-за безусловной печати END{print delay}
, поскольку функция print
, упомянутая в комментариях, всегда добавляет новую строку к любой переменной, над которой она работает. В случае версии perl
этой проблемы не возникает,поскольку с флагами -ne
функция print
не добавляет новую строку.
Тем не менее, исправление в случае awk состоит в том, чтобы сделать условие, как упоминал Dope Ghoti в комментариях, чтобы проверить длину временной переменной. Perl-версия того же исправления будет:
$ perl -ne '$s=$_ if $.%3==2;print $_. $s and $s="" if $.%3==0 or $.%3==1;END{print $s if length $s}' input.txt
Я нашел решение, может быть и лучше, но мне помогло это...
Часть 1
Вместо того, чтобы выполнять:sudo apt upgrade
сам по себе, вы должны использовать тег --fix-missing
, и сначала он не будет работать, но затем обнаружит все пакеты, которые вы установили, используя обычный метод apt -в автономном режиме, и он будет обновлен как ожидал.
Рассказ используйте эту команду:sudo apt upgrade --fix-missing
Часть 2
Теперь, если вы пытаетесь установить пакеты/продукты/модули, такие как net-tools
, например... вы делаете все то же самое, за исключением...
Не используйте :sudo apt upgrade --fix-missing
, используйте:sudo apt-get install net-tools