両方のファイルの最初の単語が同じで、残りの単語が異なる行のリストを印刷したいと思います。そしてやや複雑な混乱があるかもしれませんが、comm
もっと簡単な方法があることを願っています。grep
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:これで速度は耐えます(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
パイプ文字()で置き換えます。 (結果を直接パイプするのではなく)|
少し複雑な操作を実行するのは、出力の末尾に改行文字があるためです。echo
join
tr
join
いいえチューブに変えたいです。
サンプルファイル(質問を編集する前にOPが最初に提供したもの)、、、、join
thingyecho
はtr
を生成します。これは、フィルタリングbar|foo
の拡張正規表現の一部として使用される出力です。grep -E
diff -u
コマンドラインの出力は次のとおりです。
-bar c d
+bar x y