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+}
...
ここでは、まずツールを使用してnl
2つのファイルの行に番号を付けるdiff
か、wdiff
番号でペアにします。その後、さまざまなオプションを使用diff
し、wdiff
必要に応じて出力を調整できます。