web-dev-qa-db-ja.com

最初のファイルの個々の行を2番目のファイルのすべての行と比較しますか?

同じツールの2つの異なるバージョンによって生成されるプロジェクトの2つのTCL表現があります。それらをv1.tclおよびv2.tclと呼びましょう。

これらのログは通常、行の順序を除いて、すべての目的と目的で論理的に同一です。プロジェクトのバージョン1と2が同じである場合、v1.tclのすべての行がv2.tclで1回だけ見つかりますどこか

誰かがv2.tclに変更を加えてv1.tclにバックポートする必要があるかどうか(またはその逆)を識別できるようにしたい...つまり、私だけがしたいのです。一致しない行を参照してください。例えば:

  1. v1.tcl

    foo1
    bar1
    hello1
    world1
    
  2. v2.tcl

    hello1
    bar1
    foo2
    world1
    goodbye2
    
  3. 「diff」の戻り値:

    file1:1 foo1
    file2:3 foo2
    file2:5 goodbye2
    

自分の小さなスクリプトを書くだけでいいですか?すでにこれを行っているツールはありますか?

2

行が同一で、ifファイルに余分な行がある場合にのみ知りたい場合は、sort&diff(およびプロセス置換)を使用できます。ここに):

$ diff -B <(sort v1.tcl) <(sort v2.tcl)
2c2,3
< foo1
---
> foo2
> goodbye2

空白行を無視するには、diffの-Bを使用します。次に、grep -n [pattern] fileを使用して、パターンがどの行にあるかを見つけることができます(おそらく、grepcutsedawk)、それが重要な場合。

これはより完全な答えであり、一致を含むファイルと行番号を示しています。 sedやawkを使用せず、bash、cut、grepを使用します...これがすべて(基本的に)1行にまとめられています。

diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line; do if \
echo "$line" | grep -q "^<"; then grep -F -n -H \
"$(echo "$line"|cut -c3-)" v1.tcl ; Elif echo "$line" | grep -q \
"^>"; then grep -F -n -H "$(echo "$line"|cut -c3-)" v2.tcl ; fi done

または複数の行に分割します。

diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line
do
  if echo "$line" | grep -q "^<"
    then grep -F -n -H "$(echo "$line"|cut -c3-)" v1.tcl
  Elif echo "$line" | grep -q "^>"
    then grep -F -n -H  "$(echo "$line"|cut -c3-)" v2.tcl
  fi
done

また、入力ファイルに応じて(特に、末尾に円記号が付いた行がある場合)、readとgrepに次のオプションを使用しています。

  • read -rバックスラッシュが文字をエスケープできないようにする
  • grep -F PATTERNを(正規表現ではなく)固定文字列のリストとして解釈し、改行で区切ります。いずれも一致します。

また、 Pimp Juice IT's コメントを使用して、入力ファイルの行に末尾の円記号がある場合、grepは「file:line末尾の円記号」エラーを返します。 grepの-Fオプションを使用して、末尾のバックスラッシュエラーをクリアすると、grepのみのソリューションがはるかに小さくなります。

grep -FvHn -f v2.tcl v1.tcl ;grep -FvHn -f v1.tcl v2.tcl

使用されるgrepのオプション:

  • -fFILEから1行に1つずつパターンを取得します。
  • -F PATTERNを(正規表現ではなく)固定文字列のリストとして解釈し、改行で区切ります。いずれも一致します。
  • -v一致する意味を反転して、一致しない行を選択します。
  • -H一致するたびにファイル名を出力します
  • -n出力の各行の前に入力ファイル内の1から始まる行番号を付けます。
5
Xen2050