我有两个文件 _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-case
aaB
aBa
abc
ab-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