Исходные файлы:
file1
==========
fs fsd fdd fs123
fs 333 6fdd fs123
fs 2fsd 7fdd fs123
fs 333 8fdd fs123
fs 333 9fdd fs123file2
==========
fs fsd 00fdd 444
fs ggg 333 444 fs123
fs ggg 333 444 fs123
fs ggg ==3fsd 444 fs123
fs ggg 333 444 fs123
fs ggg ==4fsd 444 fs123
fs hhh4fsd= ==009fdd 444
fs hhh 4fsd 444 fs123
fs hhh 333 444 fs123
Как видно, замены должны быть произведены во 2, 5 строках, что и произошло.
Результат выполнения скрипта
============================
cat -n /tmp/file2
1 fs fsd 00fdd 444
2 fs ggg 333 6fdd fs123
3 fs ggg 333 444 fs123
4 fs ggg ==3fsd 444 fs123
5 fs ggg 333 9fdd fs123
6 fs ggg ==4fsd 444 fs123
7 fs hhh4fsd= ==009fdd 444
8 fs hhh 4fsd 444 fs123
9 fs hhh 333 444 fs123
Или я не вижу своей ошибки/не понял Вашей трактовки. Или Вы ошибаетесь.
Суть скрипта: перебираю второй элемент файла $file1 построчно. Для каждой строки получаю 3 элемент $file2 в строке с тем же номером. В случае, если они равны, нахожу 3 элемент в первом файле и заменяю 4ый awk { $4 } во втором.
К недостаткам способа можно отнести, что $file2 каждый раз перезаписывается целиком. Как сказано ниже, ничего не мешает считать его в $var, по окончании правки которого, слить в файл.