同様の行を区別する

同様の行を区別する

両方のファイルの最初の単語が同じで、残りの単語が異なる行のリストを印刷したいと思います。そしてやや複雑な混乱があるかもしれませんが、commもっと簡単な方法があることを願っています。grepcut

編集する:何かを一つにまとめました作業コード。テスト例:

$ 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:これで速度は耐えます(1800行と8700行の2つのファイルを比較するのに0.5秒)。

答え1

file1とが両方とも並べ替えられているとしますfile2(そうでなければjoin機能しません)。

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

説明する:

このjoinコマンドは、2つのファイルに表示される関連フィールド(つまり、2つのファイル内の同じ行の最初の単語)を1行に1つずつ出力します。echoただし、すべてのスペースをtrパイプ文字()で置き換えます。 (結果を直接パイプするのではなく)|少し複雑な操作を実行するのは、出力の末尾に改行文字があるためです。echojointrjoinいいえチューブに変えたいです。

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

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

-bar c d
+bar x y

関連情報