逐行比较两个文件

逐行比较两个文件

我有两个文件,每个文件的行数相同。

1.txt

1,2,1,1
1,2,2,1
1,2,4,2
1,2,1,2

2.txt

1,2,1,2
1,2,2,1
1,2,4,1
1,2,1,1

现在我想逐行比较它们,第一行与第一行,第二行与第二行,依此类推,并打印第一个文件(1.txt)中与第二个文件(2.txt)中相应行不匹配的那些行。 TXT)。

在这种情况下,输出将是:

1,2,1,1
1,2,4,2
1,2,1,2

答案1

使用 awk:

awk 'NR==FNR{a[$0];next}(!($0 in a)){print}' file2 file1

NR==FNR{a[$0];next}
为第一个文件(file2)创建一个数组a,其中 key $0=整行,然后转到下一行。 NR是awk的全局记录号,FNR是当前文件记录号。条件 NR==FNR 仅对读取的第一个文件(文件 2)有效

(!($0 in a){print}
当第一个file2完成后,然后读取file1,如果file1的整行$0不属于数组的键,则a打印此行。

使用 grep:

grep -vxF -f file2 file1

-v: 捕获不匹配的行
-x: 匹配整行
-F: 进行固定匹配而不是模式匹配
-f: 使用 file2 加载模式

对于更新的数据为了执行逐行比较,您可以使用 awk 而不是 grep :

awk 'NR==FNR{a[FNR]=$0;next}$0!=a[FNR]{print}' file2 file1
1,2,1,1
1,2,4,2
1,2,1,2

显然,两个文件应该具有相同的行数。

答案2

简单comm(逐行比较两个排序的文件)方法:

comm -2 -3 1.txt 2.txt

输出:

1,2,1,2
1,2,3,3

  • -2- 抑制列2(唯一的行FILE2

  • -3- 抑制列3(两个文件中都出现的行)


如果输入文件未排序,请使用以下命令:

comm -2 -3 <(sort 1.txt) <(sort 2.txt)

----------

diff使用带有选项的工具的替代解决方案--LTYPE-line-format=LFMT

diff --unchanged-line-format="" --old-line-format="%L" --new-line-format="" 1.txt 2.txt
  • --unchanged-line-format=""- 消除打印公共线

  • --new-line-format=""- 消除第二个文件中的打印行

  • --old-line-format="%L"- 输出第一个文件中的关键行

答案3

只需简单地使用 diff 命令:

 diff --suppress-common-lines -n file1 file2

对于您的示例文件输出将如下所示:

>diff file1 file2
2,3c2,3
< 1,2,1,2
< 1,2,3,3
---
> 1,2,1,1
> 1,2,3,1

< 表示来自 file1 的行,

> 指示 file2 中的行,

= 两个文件共有的指示行

答案4

我基本上遇到了同样的问题(除了我想在两行不同时打印它们,而不仅仅是文件 1 中的行)。我找到了一个很好的解决方案这个线程

wdiff <(nl file1) <(nl file2)

示例输出:

...
77  true
78  false
79  [-true-]        {+false+}
80  [-true-]        {+false+}
...

在这里,我们首先使用该工具对nl两个文件的行进行编号,以便diffwdiff按编号将它们配对。然后,您可以根据需要使用各种选项diffwdiff调整输出。

相关内容