我有两个文件,每个文件的行数相同。
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
两个文件的行进行编号,以便diff
或wdiff
按编号将它们配对。然后,您可以根据需要使用各种选项diff
并wdiff
调整输出。