我一直在使用简单的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)。
答案 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