2つのファイルを各列と比較し、対応する違いを別のファイルに書き込み、列の不一致を示す識別情報を書き込む必要があるという要件がありました。 不一致の列を指摘することが私の主な問題ステートメントです。たとえば、次のようなファイルがあります。
File 1
1|piyush|bangalore|dev
1|piyush|bangalore|QA
2|pankaj|bangalore|dev
3|rohit|delhi|QA
File 2
1|piyush|bangalore|QA
1|piyush|bangalore|QA
2|pankaj|bangalore|dev
3|rohit|bangalore|dev
期待される出力ファイルは、次のようになります。
File 1
1|piyush|bangalore|**dev**
File 2
1|piyush|bangalore|**QA**
File 1
3|rohit|**delhi**|**QA**
File 2
3|rohit|**bangalore**|**dev**
不一致の行とともに不一致の列も表示できる、このようなものを実現したいと思います。私が試してみました
diff File1 File2 > Diff_File
しかし、これは私に不一致のレコードまたは行のみを与えています。 不一致の列も指摘する方法がありません。これは非常に新しいので、シェルスクリプトまたはawkコマンドを使用することが可能かどうかを教えてください。前もって感謝します。
Python 3.xソリューション:
diff_marked.pyスクリプト:
import sys
file1_name = sys.argv[1]
file2_name = sys.argv[2]
with open(file1_name, 'r') as f1, open(file2_name, 'r') as f2:
f1_lines = f1.readlines() # list of lines of File1
f2_lines = f2.readlines() # list of lines of File2
for k,l in enumerate(f1_lines):
f1_fields = l.strip().split('|') # splitting a line into fields by separator '|'
if k < len(f2_lines) and f2_lines[k]:
has_diff = False
f2_fields = f2_lines[k].strip().split('|')
for i,f in enumerate(f1_fields):
if f != f2_fields[i]: # comparing respective lines 'field-by-field' between two files
f1_fields[i] = '**' + f + '**' # wrapping differing fields
f2_fields[i] = '**' + f2_fields[i] + '**'
has_diff = True
if has_diff:
print(f1.name) # print file name
print('|'.join(f1_fields))
print(f2.name)
print('|'.join(f2_fields))
使用法:(別のpythonバージョンがある可能性があり、現在のケースはテスト済みですonpython 3.5)
python3.5 diff_marked.py File1 File2 > diff_output
diff_output
内容:
File1
1|piyush|bangalore|**dev**
File2
1|piyush|bangalore|**QA**
File1
3|rohit|**delhi**|**QA**
File2
3|rohit|**bangalore**|**dev**