Как объединить два файла как альтернативные строки?

Я знаю, как объединить две таблицы для печати альтернативных строк в новом файле, но я хочу объединить каждые две строки из 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
3
задан 25 November 2018 в 11:11

3 ответа

Используя 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
7
ответ дан 1 December 2019 в 12:56

Можно использовать 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 и распечатывает их разделенный новыми строками.

6
ответ дан 1 December 2019 в 12:56

Исходный сценарий оболочки

Я думал, что следующий сценарий оболочки сделает это. Прием должен открыть эти два файла на отдельных дескрипторах файлов (здесь № 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
2
ответ дан 1 December 2019 в 12:56

Другие вопросы по тегам:

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