これはかなり簡単なはずです。私は Python ファンなので、Python を使用します。概要:
ファイルをその場で編集することは本当にできません...うーん、すべての新しい変数名が常に古い名前とまったく同じ長さである場合は可能だと思います。しかし、プログラミングを容易にし、実行中の安全性を確保するために、常に新しい出力ファイルを作成してから元のファイルを削除するのが最善です。これは、これを実行する前に少なくとも 20 GB の空きディスク容量が必要であることを意味しますが、それは問題ではありません。
これは、その方法を示す Python プログラムです。サンプルデータを使用してテストファイルを作成しましたが、これはうまくいくようです。
#!/usr/bin/python
import re
import sys
try:
fname_idmap, fname_in, fname_out = sys.argv[1:]
except ValueError:
print("Usage: remap_ids <id_map_file> <input_file> <output_file>")
sys.exit(1)
# pattern to match an ID, only as a complete word (do not match inside another id)
# match start of line or whitespace, then match non-period until a period is seen
pat_id = re.compile("(^|\s)([^.]+).")
idmap = {}
def remap_id(m):
before_word = m.group(1)
word = m.group(2)
if word in idmap:
return before_word + idmap[word] + "."
else:
return m.group(0) # return full matched string unchanged
def replace_ids(line, idmap):
return re.sub(pat_id, remap_id, line)
with open(fname_idmap, "r") as f:
next(f) # discard first line with column header: "oldId newIds"
for line in f:
key, value = line.split()
idmap[key] = value
with open(fname_in, "r") as f_in, open(fname_out, "w") as f_out:
for line in f_in:
line = replace_ids(line, idmap)
f_out.write(line)