1. ホーム
  2. language-agnostic

行ごとに一貫して2つのファイルをマージする方法

2023-09-14 21:47:37

質問

私は2つのファイル( file1.txt &です。 ファイル2.txt ). ファイルはあくまで例です。

この2つのファイルをマージして、次のようなファイルを作成するにはどうしたらよいでしょうか。 merge_files.txt を作成するにはどうしたらいいですか?

今、私は KornShell ( ksh ) スクリプトを使用するため、マージは KornShell で行うことができます。 AWK , セド , a パール のワンライナーなど。

背景 - なぜファイルをマージする必要があるのか: 私のターゲットは 古い ファイル (最初のフィールドに存在する) を 新しい ファイル (2番目のフィールドに存在) に変換します。

例1

ファイル名 ファイル1.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

ファイル名 ファイル2.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

ファイル名 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
.
.
.
.
.

例4 (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}" ] , ...).

免責事項: ファイル名にスペースがない場合のみ動作します。