Відповіді:
Для цього є додаток!
$ cat file1
file1 line1
file1 line2
$ cat file2
file2 line1
file2 line2
Тепер, якщо ви передаєте ці файли як аргументи paste
:
$ paste -d' ' file1 file2
file1 line1 file2 line1
file1 line2 file2 line2
Якщо "file1 1-й рядок, після якого file2 перший рядок, та file1 другий рядок, за яким file2 другий рядок тощо", ви маєте на увазі, що вам потрібно новий рядок між кожним вставленим рядком, просто відрегулюйте параметр -d
(роздільник).
$ paste -d'\n' file1 file2
file1 line1
file2 line1
file1 line2
file2 line2
POSIX Awk; це працює з довільною кількістю файлів, і файли навіть не повинні мати однакову кількість рядків. Сценарій продовжує працювати, поки всі файли не виходять з рядків:
BEGIN {
do {
br = ch = 0
while (++ch < ARGC)
if (getline < ARGV[ch]) {
printf ch < ARGC - 1 ? $0 FS : $0 RS
br = 1
}
} while (br)
}
Швидкий баш-розчин
# Takes as many file arguments as needed
function InterleaveFiles {
local counter=0
local hasLine=true
while [ $hasLine == true ]; do
hasLine=false
for i in "$@"; do
line=$(awk 'NR == num_line {print; exit}' num_line=$((counter+1)) "$i")
if [ -n "$line" ]; then
echo "$line"
hasLine=true
fi
done
counter=$((counter+1))
done
}
InterleaveFiles file1 file2 file3 file4
paste -d '\n' file1 file2 > file3
де file1
і file2
є вхідні файли, і file3
буде створений вихід.
printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)