#bash #awk #sed
#bash #awk #sed
Вопрос:
У меня есть 2 текстовых файла. file1.txt, file2.txt
Мне нужно заменить все символы из строки 3 в строку 5, из столбца 3 в столбец 5 из file1.txt со строки 8 по строку 10, со столбца 4 по столбец 9 из file2.txt.
Чтобы лучше понять, я заменяю прямоугольную область текстового файла прямоугольной областью, найденной в другом файле. Обратите внимание, прямоугольник в file2.txt на несколько столбцов длиннее.
Спасибо!
Ответ №1:
Параметризованное решение:
L1 = starting line in file1
L2 = starting line in file2
N = number of lines
F1a = starting field in file1
F1b = ending field in file1
F2a = starting field in file2
F2b = ending field in file2
awk -vL1=3 -vL2=8 -vN=3 -vF1a=3 -vF1b=5 -vF2a=4 -vF2b=9 '
FNR == NR {
if (FNR >= L2 amp;amp; FNR < L2 N) {
a[FNR - L2] = $F2a
for (i = F2a 1; i <= F2b; i)
a[FNR - L2] = a[FNR - L2] OFS $i
}
next
}
FNR >= L1 amp;amp; FNR < L1 N {
for (i = 1; i < F1a; i)
printf("%s%s", i == 1 ? "" : OFS, $i)
printf("%s%s", F1a == 1 ? "" : OFS, a[FNR - L1])
for (i = F1b 1; i <= NF; i)
printf("%s%s", OFS, $i)
print""
next
}
1
' file2.txt file1.txt