2013-05-06 1 views
52

У меня есть два файла (FILE1.TXT & file2.txt), файлы являются лишь примерами., как объединить два файла последовательно строка за строкой

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

Я пишу сейчас КШ сценарий, так что слияние может быть сделано с KSH, AWK, СЭД, Perl один подкладка ... и т.д.

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

example1

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 
. 
. 
. 
. 

example2

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 
+0

ли два файла всегда такой же длины? (ваша конечная цель - переименовать файлы, и вы удалите «merge_files.txt» после переименования файлов?) – MisterJ

+0

Нет, это только пример (длина или PATH может быть более сложной), а содержимое файла может быть разным (нет нужно удалить файл merge_files.txt) – 2013-05-06 07:45:08

ответ

94

Вы можете использовать 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}" ] ...).

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

+0

вставить команду, определенную в linux и solaris? , потому что мой скрипт будет работать на обеих ОС (linux & solaris) – 2013-05-06 08:42:04

+0

'paste' доступен в любой [POSIX] (http://pubs.opengroup.org/onlinepubs/009695299/utilities/paste.html) -компетентной системе и как Linux, так и Solaris с ней ([здесь] (http://docs.oracle.com/cd/E19253-01/816-5165/6mbb0m9n5/index.html) - это страница руководства Solaris на веб-сайте Oracle), поэтому это является переносным решением. –

+0

Как я могу вставлять файлы рядом друг с другом, без промежутка между ними? т. Е. Использовать 'paste -d" "file1.txt file2.txt' - без разделителя пробелов? - Заранее спасибо! –

4

Это Perl, один вкладыш будет ДИСПЛЕЙ у переименовывает необходимые

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)' 

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

0
paste -d " " file1.txt file2.txt 

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

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

Вы можете использовать GVIM, чтобы превратить их легко (Edit/Settings File/Файл Формат)

0

Полностью несвязанные пути для достижения цели Ор по переименовании пронумерованных файлов:

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 
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 
Смежные вопросы