2つのファイルの最初の単語が同一で残りの単語が同一でない行のリストを印刷したいと思います。 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:速度は耐えられるようになりました(0.5秒で1800行と8700行の2つのファイルを比較します)。
file1
とfile2
の両方がソートされていると仮定します(そうでない場合、join
は機能しません):
diff -u file1 file2 |
grep -E "^[+-]($(echo $(join -o0 file1 file2) | tr ' ' '|'))"
説明:
join
コマンドは、両方のファイル(つまり、両方のファイルで同じ行の最初の単語)で発生する結合フィールドを各行に1つずつ出力します。これはecho
ですが、すべてのスペースをパイプ(|
)に置き換えてtr
します。少し複雑なecho
を実行する理由(およびjoin
からの結果をtr
に直接パイプするだけではない)は、join
からの出力に私たちが行う最後の改行notパイプに置き換えたい。
サンプルファイル(質問の編集前にOPによって最初に提供されたもの)の場合、join
、echo
、tr
thingyはbar|foo
を生成します。これは、grep -E
の出力をフィルタリングするために、diff -u
の拡張正規表現の一部として使用されます。
コマンドラインの出力は次のとおりです。
-bar c d
+bar x y