1

我有 2 个文件 test 和 test1 ,我想在它们之间做一个差异,而输出没有额外的字符 2a3、4a6、6a9,如下所示。

mangoes
apples
banana
peach
mango
strawberry

测试1:

mangoes
apples
blueberries
banana
peach
blackberries
mango
strawberry
star fruit

当我区分两个文件时

$ diff test test1
2a3
> blueberries
4a6
> blackberries
6a9
> star fruit

我如何获得输出为

$ diff test test1
blueberries
blackberries
star fruit
4

3 回答 3

2

您可以使用grep过滤掉不是不同文本的行:

$ diff file1 file2 | grep '^[<>]'
> blueberries
> blackberries
> star fruit

如果要删除指示哪个文件不同的方向指示器,请使用sed

$ diff file1 file2 | sed -n 's/^[<>] //p'
blueberries
blackberries
star fruit

(但看不到哪个文件不同可能会令人困惑......)

于 2018-11-13T19:02:32.360 回答
2

使用的解决方案comm

comm -13 <(sort test) <(sort test1)

解释

comm -逐行比较两个排序的文件

在没有选项的情况下,生成三列输出。第一列包含 FILE1 唯一的行,第二列包含 FILE2 唯一的行,第三列包含两个文件共有的行。

-1 抑制第 1 列(FILE1 独有的行)

-2 抑制第 2 列(FILE2 独有的行)

-3 抑制第 3 列(出现在两个文件中的行

由于我们只需要第二个文件独有的行test1-13因此用于抑制不需要的列。

Process Substitution用于获取已排序的文件

于 2018-11-13T19:03:05.543 回答
1

你可以使用 awk

awk 'NR==FNR{a[$0];next} !($0 in a)' test test1
  • NR==FNR表示当前正在处理命令行(即测试)上的第一个文件,
  • a[$0]将每条记录保存在名为 的数组中a
  • next意味着阅读下一行而不做任何其他事情,
  • !($0 in a)表示如果当前行在 中不存在a,则打印它。
于 2018-11-13T18:54:32.833 回答