$ awk '{print} (FNR % 3)==0{getline<"file2.txt"; print}' file1.txt
1
2
3
A
4
5
6
B
Как это работает
print
Печатает каждый строка из файла1.txt.
(FNR % 3)==0{ getline <"file2.txt"; print}
В каждой третьей строке печатается строка из файла file2.txt.
Некоторые люди категорически против использования awk's getline
. В этом случае:
$ awk 'FNR==NR{a[NR]=$0;next} {print} (FNR % 3)==0{print a[FNR/3]}' file2.txt file1.txt
1
2
3
A
4
5
6
B
Как это работает
FNR==NR{a[NR]=$0;next}
При чтении первого файла file2.txt
мы сохраняем его строки в массиве a
, а затем пропустить остальные команды и перейти к строке ввода next
.
print
Если мы попали сюда, то читаем второй файл, file1.txt
и печатаем его строку.
(FNR % 3)==0 {print a[FNR/3]}
Если номер строки в файле file1.txt
четно кратен 3, то печатаем строку из файла file2.txt
, номер строки которого составляет одну треть от текущей строки в file1.txt
.
|
- оператор конвейера в Unix / Linux. Его можно использовать там, где выходные данные первой команды могут использоваться в качестве входных данных для второй команды.
Например:
ls -l | less
покажет длинный список ваших файлов в каталоге. Команда less
принимает выходные данные ls -l
в качестве входных данных и отображает список файлов, в которых вы прокручиваете вверх / вниз и видите их.
Эта команда записывает строку, состоящую из семи символов '.dump'
, за которой следует символ новой строки, в sqlite
команда. (Всего 12 байт.)
Команда sqlite
не сможет понять инструкцию и ничего не будет записывать в целевой файл bacula.sq
, сообщая об ошибке : неполный SQL: '.dump'
в stderr .
Возможно, вы имели в виду это вместо того, чтобы использовать символы одинарных кавычек '
вместо знаков апострофа ’
:
echo '.dump' | sqlite bacula.db > bacula.sq
Shell pipe operator |
делает стандартный вывод для команды стандартным вводом для следующей команды, не создавая промежуточного файла.
Подробную информацию, объясненную в простой форме, можно найти в следующих источниках: