Я знаю, как объединить две таблицы для печати альтернативных строк в новом файле, но я хочу объединить каждые две строки из file1.txt с одной строкой из file2.txt. Как пример:
file1.txt
A a aa
B b bb
C c cc
D d dd
и file2.txt
E e ee
F f ff
Я хочу иметь
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
Используя GNU sed, можно считать и вставить одну строку из второго файла после любой строки ("два, пропускают два") первого:
$ sed '2~2R file2.txt' file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
Немного больше многоречивой реализации того же в awk:
awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt
Можно использовать paste
команда для этого:
% paste -d '\n' - - file2.txt < file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
paste
, по умолчанию, проводит строки из каждого входного файла, затем объединяет их в одну строку, разделенную вкладками. Используя -d '\n'
, мы говорим этому использовать новые строки в качестве разделителя вместо этого. -
стандартный вход, который перенаправляется в от file1.txt
(< file1.txt
). Так paste
проводит одну строку от стандартного входа, затем другая строка от стандартного входа (эффективно две строки от file1.txt
, затем строка от file2.txt
и распечатывает их разделенный новыми строками.
Я думал, что следующий сценарий оболочки сделает это. Прием должен открыть эти два файла на отдельных дескрипторах файлов (здесь № 4 и № 5).
#!/bin/bash
while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
do
echo "$line1"
echo "$line2"
echo "$line3"
done 4<file1.txt 5<file2.txt
Сделайте исполняемый файл сценария оболочки и выполните его,
$ ./myscript
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
Исходные остановки сценария оболочки, при чтении в конец файла в одном из входных файлов (так, чтобы только соответствие 2+1 строке были записаны в вывод).
Следующий сценарий оболочки продолжит читать и писать, пока все файлы не достигли конца файла (так, чтобы все доступные строки были записаны в вывод). Это должно соответствовать тому, что хочет OP.
#!/bin/bash
end1=false
end2=false
cont=true
while $cont
do
read -r -u 4 line1
if [ $? -eq 0 ]
then
echo "$line1"
else
end1=true
fi
read -r -u 4 line2
if [ $? -eq 0 ]
then
echo "$line2"
else
end1=true
fi
read -r -u 5 line3
if [ $? -eq 0 ]
then
echo "$line3"
else
end2=true
fi
if $end1 && $end2 # modify this line to change when to stop
then
cont=false
fi
done 4<file1.txt 5<file2.txt