Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在两个文件之间进行排序差异的简单方法是什么?_Unix_Shell - Fatal编程技术网

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实用程序假定文件按词汇排序;所有字符都参与行比较。