2つのファイルを1行ずつ比較する

2つのファイルを1行ずつ比較する

2つのファイルがあり、それぞれが同じ行数を持っています。

1.txt

1,2,1,1
1,2,2,1
1,2,4,2
1,2,1,2

2.txt

1,2,1,2
1,2,2,1
1,2,4,1
1,2,1,1

1行ずつ、1行目と1行目、2行目と2行目などを比較し、最初のファイル(1.txt)を2番目のファイル(2.txt)と印刷したいと思います。の対応する行TXT)。

この場合、出力は次のようになります。

1,2,1,1
1,2,4,2
1,2,1,2

答え1

awkを使用してください:

awk 'NR==FNR{a[$0];next}(!($0 in a)){print}' file2 file1

NR==FNR{a[$0];next}:キー=フル行の
最初のファイル(file2)の配列を作成し、次の行に移動します。 NRはawkのグローバルレコード番号、FNRは現在のファイルレコード番号です。 NR==FNR 条件は、最初のファイル読み取り (ファイル 2) に対してのみ有効です。a$0

(!($0 in a){print}:
最初の file2 が完了したら file1 を読み込み、file1 の行全体が配列$0のキーに属さない場合はaこの行を印刷します。

grepを使用してください:

grep -vxF -f file2 file1

-v:一致しない行をキャプチャする:
-x完全行一致:パターン一致
-Fではなく固定一致を実行する
-f:file2を使用してパターンをロードする

更新されたデータの場合1行ずつ比較するには、grepの代わりにawkを使用します。

awk 'NR==FNR{a[FNR]=$0;next}$0!=a[FNR]{print}' file2 file1
1,2,1,1
1,2,4,2
1,2,1,2

明らかに、両方のファイルは同じ数の行を持つ必要があります。

答え2

単純なcomm(2つのソートされたファイルを1行ずつ比較する)アプローチ:

comm -2 -3 1.txt 2.txt

出力:

1,2,1,2
1,2,3,3

  • -2- 熱抑制2(行のみFILE2

  • -3- 列の抑制3(両方のファイルに表示される行)


入力ファイルがソートされていない場合は、次のコマンドを使用します。

comm -2 -3 <(sort 1.txt) <(sort 2.txt)

----------

diffオプションのツールを使用した代替ソリューション--LTYPE-line-format=LFMT

diff --unchanged-line-format="" --old-line-format="%L" --new-line-format="" 1.txt 2.txt
  • --unchanged-line-format=""- 印刷共通線を削除

  • --new-line-format=""- 2番目のファイルから印刷行を削除する

  • --old-line-format="%L"- 最初のファイルのメインラインを出力します。

答え3

単にdiffコマンドを使用してください。

 diff --suppress-common-lines -n file1 file2

サンプルファイルの場合、出力は次のようになります。

>diff file1 file2
2,3c2,3
< 1,2,1,2
< 1,2,3,3
---
> 1,2,1,1
> 1,2,3,1

< は file1 の行を表します。

>はfile2の行を表します。

=両方のファイルに共通のディレクティブ行

答え4

基本的に同じ問題があります(ファイル1の行だけでなく、2つの異なる行を印刷したい場合を除き)。良い解決策を見つけました。このスレッド

wdiff <(nl file1) <(nl file2)

出力例:

...
77  true
78  false
79  [-true-]        {+false+}
80  [-true-]        {+false+}
...

ここでは、まずツールを使用してnl2つのファイルの行に番号を付けるdiffか、wdiff番号でペアにします。その後、さまざまなオプションを使用diffし、wdiff必要に応じて出力を調整できます。

関連情報