如何一行一行地合并两个文件
我有两个文件( file1.txt和file2.txt ),文件只是例子。
如何合并这两个文件,以创build文件 – merge_files.txt作为例子3
我现在写ksh脚本,所以合并可以用ksh,awk,sed,perl,one liner等来完成
背景 – 为什么我需要合并文件:我的目标是将旧文件 (存在于第一个字段中)重命名为NEW文件 (存在于第二个字段中),
例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 . . . .
例题
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 . . . .
示例3
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
您可以使用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单行程将显示必要的重命名
perl -e 'open $f[$_-1], "file$_.txt" for 1,2; print "rename @n\n" while chomp(@n = map ''.<$_>, @f)'
如果这适用于你,那么用一个真正的重命名和使用replaceprint
语句
perl -e 'open $f[$_-1], "file$_.txt" for 1,2; rename @n while chomp(@n = map ''.<$_>, @f)'
做实际的重命名