たとえば、複数のヘッダーを持つ複数のファイルを、すべての情報を含む1つのファイルにリンクしたいとします。
ファイル1:
Numbers
1
2
3
Letters
A
B
C
ファイル2:
Numbers
4
5
6
Letters
D
E
F
ファイル3は、次のものをマージすることによって生成されます。
Numbers
1
2
3
4
5
6
Letters
A
B
C
D
E
F
これまでcatを試してfile2を最後に追加し、各ヘッダーの下のすべてのデータをgrepしようとしましたが、簡単に言えば失敗しました。
貼り付けようとしましたが、各ファイルのデータ量が等しい場合は、最後のファイルの横に[ファイル固有の情報]タブを追加するので、悪くはありませんが、あるファイルのヘッダーの下に他のファイルよりも多くの項目がある場合は混乱を招きます。
この種の問題を解決する方法を知っている人はいますか?
ベストアンサー1
セクションキーワードの下に「====」があると仮定すると、次のPythonはセクション名を明示的に指定せずに問題を解決します。
import sys
from collections import OrderedDict
combined = OrderedDict()
seperator = '===='
for file_name in 'f1.txt f2.txt'.split(): #sys.argv[1:]:
with open(file_name) as fp:
lines = fp.readlines()
data = []
while len(lines):
# reverse over the lines
line = lines.pop(-1)
if not line.strip(): continue # skip empty
if line.startswith(seperator):
name = lines.pop(-1)
section = combined.setdefault(name, [])
section.extend(reversed(data))
data = []
else:
data.append(line)
for idx, k in enumerate(reversed(combined)):
if idx != 0:
print # insert empty line before all but first
sys.stdout.write(k)
print('=' * len(k))
for line in combined[k]:
sys.stdout.write(line)
コマンドラインを呼び出すときにファイル名を指定する必要があります。
これにより、次のような出力が生成されます。
Numbers
========
1
2
3
4
5
6
Letters
========
A
B
C
D
E
F