как объединить два файла последовательно строка за строкой

у меня есть два файла (file1.txt & file2.txt), файлы являются только примерами .

как объединить два файла, чтобы создать файл -merge_files.txt Пример 3

Я пишу сейчас скрипт ksh, поэтому слияние можно сделать с помощью KSH,awk,sed, perl одного лайнера ...и т. д.

фон-почему мне нужно объединить файлы: моя цель-переименовать старый файл (существует в первом поле) для новый файл (существовать во втором поле) ,

пример1

more file1.txt

/etc/port1-192.9.200.1-255.555.255.0
/etc/port2-192.9.200.1-255.555.255.0
/etc/port3-192.9.200.1-255.555.255.0
/etc/port4-192.9.200.1-255.555.255.0
/etc/port5-192.9.200.1-255.555.255.0
.
.
.
.

Пример 2

more file2.txt

/etc/port1-192.90.2.1-255.555.0.0
/etc/port2-192.90.2.1-255.555.0.0
/etc/port3-192.90.2.1-255.555.0.0
/etc/port4-192.90.2.1-255.555.0.0
/etc/port5-192.90.2.1-255.555.0.0
.
.
.
.

example3

 more merge_files.txt



 /etc/port1-192.9.200.1-255.555.255.0  /etc/port1-192.90.2.1-255.555.0.0
 /etc/port2-192.9.200.1-255.555.255.0  /etc/port2-192.90.2.1-255.555.0.0
 /etc/port3-192.9.200.1-255.555.255.0  /etc/port3-192.90.2.1-255.555.0.0
 /etc/port4-192.9.200.1-255.555.255.0  /etc/port4-192.90.2.1-255.555.0.0
 /etc/port5-192.9.200.1-255.555.255.0  /etc/port5-192.90.2.1-255.555.0.0
 .
 .
 .
 .
 .

example4 (merge_files.структура txt)

 first field                           second field

 OLD file                              NEW file

5 ответов


можно использовать paste формат файлов бок о бок:

$ paste -d" " file1.txt file2.txt
/etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0
/etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0
/etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0
/etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0
/etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0

например:

$ paste -d" " file1.txt file2.txt | while read from to; do echo mv "${from}" "${to}"; done
mv /etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0
mv /etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0
mv /etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0
mv /etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0
mv /etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0

конечно, вы хотели бы бросить некоторые проверки безопасности ([ -f "${from}" ], ...).

отказ от ответственности: работает только в том случае, если в именах файлов нет пробелов.


этот Perl One-liner отобразит необходимые переименования

perl -e 'open $f[$_-1], "file$_.txt" for 1,2; print "rename @n\n" while chomp(@n = map ''.<$_>, @f)'

Если это работает для вас, то замените print оператор с реальным переименованием и использованием

perl -e 'open $f[$_-1], "file$_.txt" for 1,2; rename @n while chomp(@n = map ''.<$_>, @f)'

чтобы сделать фактическое переименование


paste -d " " file1.txt file2.txt

работает отлично подходит для этой работы. Но если вы обрабатываете текстовые файлы в среде Windows и используете GNU paste, обязательно преобразуйте файлы в формат Unix (CR) и не используйте файлы с (CR-LF).

GNU paste, похоже, не обрабатывает форматы DOS должным образом, а синтаксический анализ непредсказуем, ожидаемый результат является неустойчивым и неожиданным без предупреждений.

вы можете использовать GVIM, чтобы легко преобразовать их (редактировать/настройки файла/формат файла)


совершенно несвязанные способы достижения цели OP переименования нумерованных файлов:

for f in {1..5}; do mv /etc/port$d-192.9.200.1-255.555.255.0 /etc/port$d-192.90.2.1-255.555.0.0; done

еще одна возможность, на основании rename

rename 's/192.9.200.1/192.90.2.1/' /etc/port[1-5]-192.9.200.1-255.555.255.0

команда

paste file1 file2

выход

/etc/port1-192.9.200.1-255.555.255.0    /etc/port1-192.90.2.1-255.555.0.0
/etc/port2-192.9.200.1-255.555.255.0    /etc/port2-192.90.2.1-255.555.0.0
/etc/port3-192.9.200.1-255.555.255.0    /etc/port3-192.90.2.1-255.555.0.0
/etc/port4-192.9.200.1-255.555.255.0    /etc/port4-192.90.2.1-255.555.0.0
/etc/port5-192.9.200.1-255.555.255.0    /etc/port5-192.90.2.1-255.555.0.0