join:“文件2排序不正确”


13

我有两个文件_jeter3.txt和_jeter1.txt

我检查了它们都在第20列上使用 sort -c

sort -t '     ' -c -k20,20 _jeter3.txt
sort -t '     ' -c -k20,20 _jeter1.txt
#no errors

但是当我要join两个文件都出现错误时,它说第二个文件未排序:

join -t '   ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order

我不明白为什么。

cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0

更新:使用' sort -fjoin -i(均不区分大小写)可解决此问题。但这并不能解释我最初的问题。

UPDATE:sort&join的版本:

> join --version
join (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)

> sort --version
sort (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)

您能否仅出于完整性考虑而将“ join --version”和“ sort --version”的输出提供给我们?在任何情况下,我都无法获得某些旧版本的gnu join来给我该错误消息。
Bruce Ediger

3
请发布一些显示问题的示例数据,以及的输出locale
吉尔(Gilles)'所以

Answers:


25

在Ubuntu 11.04中,在版本(GNU coreutils)8.5 sortjoin两者中出现相同的错误。

它们显然是不兼容的。实际上,该sort命令似乎有问题:使用-f--ignore-case)选项或不使用()选项都没有区别。排序时,aaB总是在之前aBa。非字母数字字符似乎也总是被忽略(abc在之前ab-x

加入似乎期望相反...但是我有一个解决方案

实际上,这与排序顺序相关联:使用LANG=en_EN sort -k 1,1 <myfile> ...then LANG=en_EN join ...消除消息。

国际化是邪恶的根源……(没有人清楚地记录下来)。


那么,如果同时使用LANG=en_EN,那肯定会起作用吗?只要它们都使用相同的语言环境,它将适用于任何语言环境吗?我们可以说sort和之间的区别join是,默认情况下,它们使用不同的语言环境吗?
亚伦·麦克戴

-k选择的答案在这里,或者是它的LANG=en_EN?目前尚不清楚确切的解决方案。
用户

5

您在按数字排序吗?我发现我加入的专栏零填充为我解决了这个问题。

cat file.txt \
     | awk -F"   " '{ $20=sprintf("%06s", $20); print $0}' \
     | sort > readytojoin.txt

5

如果您确定对输入文件进行了正确的排序并且它们的行可以配对,则可以通过运行以下命令避免出现上述错误 join --nocheck-order file1.txt file2.txt


4

sort 默认情况下,使用整行作为键

join 仅使用指定的字段作为键。

您必须通过限制排序以仅使用要加入的键来纠正这种不兼容性。

Join手册页指出:

重要说明:FILE1和FILE2必须在连接字段上排序。例如,如果>'join'没有选项,请使用'sort -k 1b,1'。注意,比较遵循“ LC_COLLATE”指定的规则。如果未对> input进行排序,并且某些行无法连接,则会显示警告消息。


2
LOCALE=C sort ...
LOCALE=C join ...

这样可以解决您的问题。@Michael指出的问题是排序顺序,这取决于您的LOCALE设置。


2

请注意,如果您看到此错误,并且已经在特定的列上进行了排序,并且将您的头靠在墙上,例如sort -k4,4,那么您可能还需要为sort命令设置分隔符

显然,OP已经使用-t''完成了此操作,但对于普通制表符分隔的文本,我建议

sort -t $'\t' ...

默认情况下,即使在看起来像用制表符分隔的文件上(尤其是要在其上进行排序的列中有空格),sort命令也可以将空格作为分隔符合并。

然后,如果您将排序后的数据传递给加入,

join -t $'\t' ...

然后,这最终导致有关未排序的错误消息。如上所述,join可能不接受-t''。


1

要加入-t之后的参数是一个字符。对于排序,您可以提供更长的排序分隔符。我认为您可能正在将文件加入所需的其他字段,而忽略大小写可通过巧合解决问题。

我同意Gilles的观点,即样本数据会有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.