两个列表之间的Grep差异

时间:2016-06-15 12:29:04

标签: windows bash macos grep cygwin

我一直在使用简单的grep命令输出两个文件之间的差异,它在Windows 10(cygwin grep)和Windows 10的基于Ubuntu的Bash shell中运行良好,与Cygwin和#一起工作得很好39; s Grep,但不适用于Mac OS X Yosemite。

以下是我一直在使用的非常简单的命令行:

 grep -F -v -f list1.txt list2.txt > differences1.txt

Mac OS X从终端发出该命令会导致长暂停,无输出到屏幕。我已经检查了list1.txt和list2.txt,以确保它们具有相应操作系统的相应行终止,但仍然无法正常工作。我已经咨询了grep的手册页以及命令行帮助,并且无法识别导致此问题的不同操作系统之间的参数差异。但是这里的记录是Windows 10 Bash Shell Grep版本(GNU grep 2.16)和Mac OS X Yosemite(BSD grep 2.5.1-FreeBSD)。

2 个答案:

答案 0 :(得分:1)

确保您运行的是正确的grep(不是别名,功能或以前在PATH上找到的某些脚本):

/usr/bin/grep -F -v -f list1.txt list2.txt > differences1.txt

FreeBSD中的许多工具(Mac OS X所基于的)和GNU发行版的功能不同。也就是说,命令中的参数确实在各版本中看起来一致。

您可以使用Homebrew安装GNU grep:

brew tap homebrew/dupes; brew install grep

然后使用命令ggrep运行它。

作为旁注:您还可以安装其他GNU工具(例如gdate的{​​{1}})与:

date

答案 1 :(得分:1)

techraf建议安装GNU coreutils以便在Windows Bash Shell中使用grep将始终适合您。

即使没有,FreeBSD awk也有足够的功能来通过以下逻辑来区分两个文件: -

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

将在awk version 20091126 (FreeBSD)

上确认两个文件之间的差异

假设我的文件如下: -

文件1: -

1
2
3
4

file2的: -

2
5

要获取file1中唯一的行,请执行

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

将产生输出

1
3
4

要获取file2中唯一的行,请执行

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

将产生输出

5