1

我有两个文件large_inputsubset_input文件,它们的内容可能是

large_input

1
34
65
7643
hello
we

subset_input

65
we
hello
34

在这种情况下sort,命令不是很有帮助,否则sort | uniq在后面的两个文件上都diff非常有用

问题 在这种数据无法排序的场景中(因为它的内容),找出最好的方法是什么

large_input-subset_input这将是

1
7643
4

3 回答 3

1
diff <(sort file1) <(sort file2) | sed '/^[0-9][0-9]*[acd][0-9]*/d;s/^[<>] //'

为我工作,

输出:

1
7643

某些 shell 不支持<(sort fileX),因此您可能必须就地对文件文件进行预排序,例如sort -o file1 file1; sort file -o file2 file2; ....

sed 表达式从 中删除输出diff。要查看它在做什么,首先完全删除 sed,一次添加 1 个部分(由分号分隔)。

我希望这有帮助。

于 2012-11-12T19:56:26.090 回答
1

这正是comm为:

comm -23 <(sort large_input) <(sort subset_input)
于 2012-11-13T00:50:35.903 回答
0

您可以使用 sed 来生成完成这项工作的 sed 脚本:

sed -e 's#^#/^#' -e 's#$#$/d#' subset_input > sed_script

然后将此 sed 脚本应用于您的 large_input 很容易:

sed -f sed_script large_input

如果你有 bash,它可以在没有临时文件的情况下完成:

sed -f <(sed -e 's#^#/^#' -e 's#$#$/d#' subset_input) large_input

但是,此解决方案仅适用于“合理”大小的子集输入。

于 2012-11-12T23:43:27.973 回答