如何在shell脚本中逐行比较一个文件与另一个文件的内容?

如何在shell脚本中逐行比较一个文件与另一个文件的内容?

文件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. 在两个文件中找到的行。

您可以使用数字 1、2 或 3 来-n“关闭”列。例如,在上面的第一个命令中,我们使用,它与 相同,它会关闭默认输出中除第一列之外的所有列。n-23-2 -3

相关内容