join :“文件 2 未按排序顺序”

join :“文件 2 未按排序顺序”

我有两个文件 _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 -f' 和join -i(均不区分大小写)可以解决问题。但这并不能解释我最初的问题。

更新:排序和连接的版本:

> 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.
(...)

答案1

sort我在 Ubuntu 11.04和join版本 (GNU coreutils) 8.5 中都遇到了同样的错误。

它们显然是不相容的。事实上,该命令似乎有问题:有或没有( ) 选项sort没有区别。排序时,始终位于 之前。非字母数字字符似乎也总是被忽略(之前)-f--ignore-caseaaBaBaabcab-x

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

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

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

答案2

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

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

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

Join 手册页指出:

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

答案3

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

答案4

你是用数字排序的吗?我发现对我要加入的列进行零填充解决了我的这个问题。

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

相关内容