Вам нужно перебрать файл подстановки, а затем зациклить целевые файлы. Я думаю, вы почти у цели. У меня есть что-то вроде следующего (Я добавил некоторые имена файлов, чтобы работало подстановочное значение):
!/bin/bash
i=1
FILES=./other_file*
while read r; do
for f in $FILES; do
sed "s/11111/$r/g" > newfiles/file$i.txt < $f
i=$(( i + 1 ))
done
done <file1
Здесь мы сначала указываем, что используем bash в качестве оболочки. Затем установите счетчик i
на 1. Далее glob
файлы в переменную. Цикл по файлу1 и присвоение каждой строки переменной r
. Затем для каждого из файлов подставьте строку 11111
с тем, что мы видели в строке.Выведите его в новый файл, используя счетчик в имени, а затем увеличьте счетчик. Повторяйте, пока петли не будут сделаны.
Как насчет Awk? сохраните сопоставления из file1
в ассоциативный массив, а затем выполните цикл по массиву для каждой строки других файлов:
awk -v OFS= '
NR==FNR {t[NR]=$0; next}
{s = $0}
{
for(i in t) {
$0 = s;
sub(/11111/,t[i]);
$1=$1;
print > "newfile" ++n
}
}' file1 file2 file3
(OFS=
и $1=$1
предназначены только для того, чтобы заставить запись повторно -оцениваться с пустым разделителем полей, чтобы удалить пробелы между полями ). Результаты:
$ head newfile*
==> newfile1 <==
AAAAAA2222233333
==> newfile2 <==
BBBBBB2222233333
==> newfile3 <==
22222AAAAAA33333
==> newfile4 <==
22222BBBBBB33333
Я использовал приведенный ниже скрипт для достижения того же самого
for i in `cat mainfile`; do sed "s/11111/$i/g" file1 |sed -r "s/\s+//g" >file1_$i; sed "s/11111/$i/g" file2|sed -r "s/\s+//g" >file2_$i;done
выход
Пожалуйста, найдите вывод всех 4 файлов
AAAAAA2222233333
============================
BBBBBB2222233333
============================
22222AAAAAA33333
============================
22222BBBBBB33333
==========================
==