2016-03-28 2 views
4

У меня есть два файла, и я пытаюсь вставить строку из файла2 в file1 каждые четыре строки, начиная с начала файла1. Так, например:shell вставить строку в каждую строку n

file1:

line 1 
line 2 
line 3 
line 4 
line 5 
line 6 
line 7 
line 8 
line 9 
line 10 

file2:

50 
43 
21 

выход Я пытаюсь получить:

50 
line 1 
line 2 
line 3 
line 4 
43 
line 5 
line 6 
line 7 
line 8 
21 
line 9 
line 10 

код у меня есть:

while read line 
do 
    sed '0~4 s/$/$line/g' <file1.txt> file2.txt 
done < file1.txt 

Я получаю следующее сообщение об ошибке:

sed: 1: "0~4 s/$/$line/g": invalid command code ~ 
+0

его чтение из другого файл. В этом случае file1 – jeabesli

+0

Можете ли вы показать образцы данных из 'file1'? – anubhava

+1

Я отредактировал вопрос, так как мои файлы были замешаны – jeabesli

ответ

2

Следующие шаги через оба файлов без загрузки либо один в массив в памяти:

awk '(NR-1)%4==0{getline this<"file2";print this} 1' file1 

Это может быть предпочтительным, если фактическая file2 больше, чем то, что вы хотите, чтобы держать в памяти.

Это ломается следующим образом:

  • (NR-1)%4==0 - это состояние, которое соответствует каждой 4-ю строку, начиная с 0
  • getline this<"file2" - получает строку из «file2» и сохраняет его в переменной this
  • print this - принт ... это.
  • 1 - сокращение для «напечатать текущую строку», которая в этом случае происходит из file1 (обычный вход AWK в)
+0

Большое спасибо – jeabesli

2

Это ослабление, чтобы сделать это с помощью awk:

awk 'FNR==NR{a[i++]=$0; next} !((FNR-1) % 4){print a[j++]} 1' file2 file1 

50 
line 1 
line 2 
line 3 
line 4 
43 
line 5 
line 6 
line 7 
line 8 
21 
line 9 
line 10 
  • во время обработки первого файла в входе т.е. file2 мы сохраняем каждую строку в массиве с в качестве увеличивающего числа, начиная с 0.
  • При обработке второго файла во входных данных, то есть file1, мы проверяем, делится ли текущая запись # на 4 с использованием модульной арифметики, и если она затем вставляет строку из file2 и увеличивает счетчик индексов.
  • И наконец, используя действие 1, мы печатаем линии от file1.
-1

Вот тупой способ сделать это с paste и tr

paste file2 <(paste - - - - <file1) | tr '\t' '\n' 

Предполагается, что у вас нет фактических вкладок в ваших входных файлах.

1

другая альтернатива с Unix набора инструментов

$ paste file2 <(pr -4ats file1) | tr '\t' '\n' 

50 
line 1 
line 2 
line 3 
line 4 
43 
line 5 
line 6 
line 7 
line 8 
21 
line 9 
line 10 
2

Это может работать для вас (GNU СЭД):

sed -e 'Rfile1' -e 'Rfile1' -e 'Rfile1' -e 'Rfile1' file2 

или просто использовать кота и пасты:

cat file1 | paste -d\\n file2 - - - - 
Смежные вопросы