ファイル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
デフォルトでは、comm
3つの列が出力されます。
- 最初のファイルに固有の行、
- 2番目のファイルに固有の行
- 両方のファイルで行が見つかりました。
数字 1、2、または 3 を使用して列を-n
「オフ」にできます。たとえば、上記の最初のコマンドと同じを使用します。これは、基本出力から最初の列を除くすべての列をオフにすることです。n
-23
-2 -3