Unix 在两个文件之间进行排序差异的简单方法是什么?
我有两个文件,其中一些行的顺序发生了变化。我希望能够比较这些 一个网站建议这样做:Unix 在两个文件之间进行排序差异的简单方法是什么?,unix,shell,Unix,Shell,我有两个文件,其中一些行的顺序发生了变化。我希望能够比较这些 一个网站建议这样做: diff <(sort text2) <(sort text1) diffs file1 file2 [other diff args, e.g. -y] diff您发布的“diff”的问题是diff只能通过stdin接收一个文件。因此,我认为您必须将至少一个排序文件写入临时文件 diff - file.txt 将区分stdin和file.txt。“-”表示stdin 编辑:我假设流程替换将通过
diff <(sort text2) <(sort text1)
diffs file1 file2 [other diff args, e.g. -y]
diff您发布的“diff”的问题是diff
只能通过stdin
接收一个文件。因此,我认为您必须将至少一个排序文件写入临时文件
diff - file.txt
将区分stdin和file.txt。“-”表示stdin
编辑:我假设流程替换将通过stdin工作。但事实并非如此,正如上面Vardhandtnet所指出的那样,上面的代码是通过/dev/fd/{num}
实现的。如果这对shell不起作用,只需在3行中完成:
sort text1 > text1.sorted
sort text2 > text2.sorted
diff text1.sorted text2.sorted
简单但应该可以工作…此重定向语法特定于bash。因此,它在tcsh中不起作用
可以调用bash并直接指定命令:
bash -c 'diff <(sort text2) <(sort text1)'
bash-c'diff这里有一个函数:
function diffs() {
diff "${@:3}" <(sort "$1") <(sort "$2")
}
如果有必要,你可以按照大卫·施密特的回答修改它
有更好的办法吗
是的,有
使用comm
实用程序:
用法:comm[-123i]file1 file2
在fish
shell中
diff (sort a.txt | psub) (sort b.txt | psub)
一些shell(当然是zsh,bash可能是)使用/dev/fd设备将命令的输出显示为另一个命令的文件名,这是一个很好的技巧,但我不完全理解它为什么有效。您能解释一下用“bash-c”包装它是如何使重定向工作的吗?这会在意外标记“(”附近出现“-sh:语法错误”在MacOSX终端上。您是否已将命令逐字复制到您的终端上?听起来好像引号或某些东西丢失了。如果您当前的shell不是bash
,则必须使用bash-c
进行包装。消息“语法错误接近意外标记”的原因可能是手册页的之间有一个空格:comm实用程序假定文件按词汇排序;所有字符都参与行比较。