文件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
我假设我们可以将这两个文件视为包含行的文本文件,即文件中的路径名都没有嵌入文字换行符,如果它们嵌入了换行符,则它们会以某种方式编码(可能为\n
)。有了这个假设,我们可以使用comm
排序后的数据来提取每个文件唯一的路径名。对数据进行排序是使用的要求comm
。
仅第一个文件特有的行:
comm -23 <( sort TOp.txt ) <( sort POp.txt ) >Op1.txt
如果其中一个或两个文件已排序,您显然可以按原样使用这些文件,而无需进行进程<( sort ... )
替换。
仅第二个文件特有的行:
comm -13 <( sort TOp.txt ) <( sort POp.txt ) >Op2.txt
默认情况下,comm
输出三列:
- 第一个文件特有的行,
- 第二个文件中特有的行,以及
- 在两个文件中找到的行。
您可以使用数字 1、2 或 3 来-n
“关闭”列。例如,在上面的第一个命令中,我们使用,它与 相同,它会关闭默认输出中除第一列之外的所有列。n
-23
-2 -3