Заявление о присоединении, пропускающее записи
Использование: Unix 2.6.18-194.el5
У меня возникла проблема, когда этот оператор соединения пропускает значения / индексы из совпадения. Я обнаружил, что значения находятся в диапазоне 11-90 (из примерно 3,5 миллиона записей), и я попытался найти иностранные символы, но я могу что-то пропустить (Попробовал cat -v, чтобы увидеть скрытые символы).
Вот оператор соединения, который я использую (только для упрощения выводим столбцы):
join -t "|" -j 1 -o 1.1 2.1 file1 file2> fileJoined
содержимое файла1 (первые 20 значений):
1 3 7 11 12 16 17 19 20 21 27 28 31 33 34 37 39 40 41 42
содержимое файла file2 (первые 50 значений, чтобы вы могли увидеть, где оно будет соответствовать):
1 | US 2 | US 3 | US 4 | US 5|US 6|US 7|US 8|US 9 | US 10 | US 11 | US 12 | US 13 | US 14 | US 15|US 16|US 17|US 17|US 18|US 19 | US 20 | US 21 | US 22 | US 23 | US 24 | US 25|US 26|US 27|US 28|US 29 | US 30 | US 31 | US 32 | US 33 | US 34 | US 34 | US 35|US 36|US 37|US 38|US 39 | US 40 | US 41 | US 42 | US 43 | US 45|US 45|US 46|US 47|US 48|US 49 | US 50 | US
Из моего первоначального тестирования выясняется, что файл2 является виновником. Потому что, когда я создаю новый файл со значениями 1-100, я могу получить оператор соединения, полностью совпадающий с file1; однако тот же файл не будет совпадать с file2.
Другая странная вещь состоит в том, что файл имеет длину 3,5 миллиона записей, и при значении 90 они снова начинают сопоставляться. Например, вывод fileJoined выглядит следующим образом (только первые 20 значений):
1 | 1 3 | 3 7 | 7 90 | 90 91 | 91 92 | 92 93 | 93 95 | 95 96 | 96 97 | 97 98 | 98 99 | 99 106 | 106 109 | 109 111 | 111 112 | 112 115 | 115 116 | 116 117 | 117 118 | 118
Другие вещи, которые я пробовал:
- Использование vi для ручного ввода новой строки 11 (все еще не совпадает в операторе соединения)
- копирование кода в блокнот, удаление строк в vi, а затем копирование их обратно (тот же результат, не соответствует 11-90)
- Удаление строк 11-90, чтобы увидеть, если проблема затем переходит на 90-170 и не сдвигается
Я думаю, что могут быть некоторые скрытые значения, которые я пропускаю, или что 11 - 90 из file1 - это не тот же двоичный эквивалент, что и 11 - 90 в file2?
Я потерян здесь, любая помощь будет принята с благодарностью.
1 ответ
Я попробовал это, и я заметил пару вещей.
Во-первых: это незначительно, но я думаю, что вы пропустите запятую в вашем -o
спецификатор. Я изменил это на -o 1.1,2.1
,
Но затем, запустив только фрагменты, которые вы разместили, я получил только три строки вывода:
1|1
3|3
7|7
Я думаю, это потому, что объединение предполагает алфавитную сортировку, а ваши входные файлы выглядят так, как будто они отсортированы по номерам.
Правило № 1 объединения (1) - убедиться, что ваши входы отсортированы, и то же самое, что и объединение, ожидает, что они будут!
Когда я пропустил два входных файла через сортировку и снова соединил их, я получил 18 строк вывода. (Сортировка была простой, поскольку вы объединяетесь по первому столбцу; мне не пришлось возиться со спецификаторами столбцов сортировки.)
Помните, что в наши дни сортировка не всегда сортируется так, как вы ожидаете, из-за проблем с локалью. Я склонен устанавливать LC_ALL=C, чтобы убедиться, что я получаю старомодное поведение, к которому я привык.