シェルスクリプトで1つのファイルの内容を別のファイルと1行ずつ比較する方法は?

シェルスクリプトで1つのファイルの内容を別のファイルと1行ずつ比較する方法は?

ファイル1の内容(TOP.txt):

/
/boot
/home
/ptd
/ptd/tcd
/ptd/splunkforwarderdd
/ptd/sdt/pqr
/ptd/smr
/ptd/apps/ddas

ファイル2コンテンツ(POp.txt):

/
/boot
/home
/ptd
/ptd/tcd
/ptd/apps/ddas
/ptc/ddd

出力ファイル1(Op1.txt):

/ptd/splunkforwarderdd
/ptd/sdt/pqr
/ptd/smr

出力ファイル2(Op2.txt):

/ptc/ddd
while read linesT; do
TOp=$linesT
while read linesP; do
    POp=$linesp
    if [[ "$TOp" == "$POp"  ]]; then        
       a=cool
    else 
       echo $TOp
    fi
  done < POp.txt
done < TOp.txt

上記のコードを試しましたが、期待どおりに動作しませんでした。

TOp.txtファイルは各行をファイル内のすべての行と比較し、ファイルPOp.txtから欠落している行を出力としてマークしたいと思いますTOp.txt

ファイルも同じですPOp.txt

ベストアンサー1

私は2つのファイルを行を含むテキストファイルとして考えることができると仮定します。つまり、ファイルのパス名のいずれにもリテラル改行文字が含まれておらず、改行文字が含まれている場合は何らかの方法でエンコードされます(おそらく\n)。これらの仮定により、commソートされたデータを使用して各ファイルの一意のパス名を抽出できます。照合順序は使用に不可欠ですcomm

最初のファイルに固有の行:

comm -23 <( sort TOp.txt ) <( sort POp.txt ) >Op1.txt

ファイルのいずれかまたは両方がソートされている場合は、プロセスを置き換える<( sort ... )ことなくファイルをそのまま使用できます。

2番目のファイルに関連する行のみ:

comm -13 <( sort TOp.txt ) <( sort POp.txt ) >Op2.txt

デフォルトでは、comm3つの列が出力されます。

  1. 最初のファイルに固有の行、
  2. 2番目のファイルに固有の行
  3. 両方のファイルで行が見つかりました。

数字 1、2、または 3 を使用して列を-n「オフ」にできます。たとえば、上記の最初のコマンドと同じを使用します。これは、基本出力から最初の列を除くすべての列をオフにすることです。n-23-2 -3

おすすめ記事