2つのファイル(fileAとfileB)の違いを確認するために比較したいと思います。 fileAはテンプレートファイルと同じで、fileBは比較したいファイルです。違いを見つけるたびに、その違いをfileCに出力したいと思います。
難しいのは、fileAとfileBには、一部のデータ(時間、日付、およびランダムに生成されたIDコード)が常に他の一部(すべてではない)行が含まれていることです。しかし、唯一の違いは、時間、日付、およびIDコードだけのfileCに行を出力したくないことです。
だから私が望むのは、fileBに表示されるすべての行から時間、日付、およびIDコードを削除してから(fileAで手動でこれを実行できます)、fileBと比較して別の行をfileCに出力することです。
削除するテキストは常に特定のパターンに従うことに注意してください。だからgrepとこれらのパターンを使用してテキストを見つけることができますが、削除する方法がわかりません...
以下は、私が意味するものを説明する2つのファイルの例です。
文書B
qaqa rara abc 10:12:25 08/20/2014 123456 def ghi fff ddd jkl 09:20:40 08/20/2014 978645 dfdf gggg
ファイルA
qaqa rara abc 10:32:15 07/15/2014 121456 xxx ghi eee ddd jkl 10:01:22 07/15/2014 971645 dfdf gggg
時間(例:10:12:25)、日付(例:08/20/2014)、またはIDコード(例:123456)を無視して、上の2つのファイルの違いを見つけて、違いをfileCに出力したいと思います。
2行が異なるため、2行と3行になります。両方のファイルの行1は同じです。時刻、日付、ID情報を削除すると、2つのファイルの4行目は同じです。
ベストアンサー1
タイムスタンプが一貫した形式の場合は、diffメソッド(sedなど)を使用して、ファイルを処理する前にそれらを削除できます。
diff <(sed -E 's|[0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{2}/[0-9]{2}/[0-9]{2,4} [0-9]{1,} ||' fileA) <(sed -E 's|[0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{2}/[0-9]{2}/[0-9]{2,4} [0-9]{1,} ||' fileB)
指定した入力ファイルをテストします。
$ diff \
<(sed -E 's|[0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{2}/[0-9]{2}/[0-9]{2,4} [0-9]{1,} ||' fileA) \
<(sed -E 's|[0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{2}/[0-9]{2}/[0-9]{2,4} [0-9]{1,} ||' fileB)
2,3c2,3
< abc xxx
< ghi eee ddd
---
> abc def
> ghi fff ddd