web-dev-qa-db-ja.com

差分類似線

2つのファイルの最初の単語が同一で残りの単語が同一でない行のリストを印刷したいと思います。 commgrep、およびcutの複雑な混乱は可能ですが、もっと簡単な方法があるといいのですが。

編集:なんとか一緒に叩きました 作業コード 。テスト例:

$ cat file1
a 1 E
b 2 F
c 3 G

$ cat file2
a M X
b 2 Y
c 3 G

$ difff 1 file1 file2 # Differences in fields 2+3
1,2c1,2
< a 1 E
< b 2 F
---
> a M X
> b 2 Y

$ difff 1-2 file1 file2 # Differences in field 3 only
1c1
< b 2 F
---
> b 2 Y

編集2:速度は耐えられるようになりました(0.5秒で1800行と8700行の2つのファイルを比較します)。

1
l0b0

file1file2の両方がソートされていると仮定します(そうでない場合、joinは機能しません):

diff -u file1 file2 |
  grep -E "^[+-]($(echo $(join -o0 file1 file2) | tr ' ' '|'))"

説明:

joinコマンドは、両方のファイル(つまり、両方のファイルで同じ行の最初の単語)で発生する結合フィールドを各行に1つずつ出力します。これはechoですが、すべてのスペースをパイプ(|)に置き換えてtrします。少し複雑なechoを実行する理由(およびjoinからの結果をtrに直接パイプするだけではない)は、joinからの出力に私たちが行う最後の改行notパイプに置き換えたい。

サンプルファイル(質問の編集前にOPによって最初に提供されたもの)の場合、joinechotr thingyはbar|fooを生成します。これは、grep -Eの出力をフィルタリングするために、diff -uの拡張正規表現の一部として使用されます。

コマンドラインの出力は次のとおりです。

-bar c d
+bar x y
2
Kusalananda