приєднатися: "Файл 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 -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.
(...)

Чи можете ви дати нам вихід "приєднатися - перетворення" та "сортувати - перетворення" лише заради повноти? Я не можу отримати деякі старіші версії gnu приєднатись, щоб надати мені це повідомлення про помилку ні за яких обставин.
Брюс Едігер

3
Будь ласка, опублікуйте деякі зразкові дані, які виявляють проблему, та вихідні дані locale.
Жил 'ТАК - перестань бути злим'

Відповіді:


25

Я отримав таку ж помилку з Ubuntu 11.04, з sortі joinобома у версії (GNU coreutils) 8.5.

Вони явно несумісні. Насправді sortкоманда здається помилковою: немає різниці з параметром -f( --ignore-case) або без нього . При сортуванні aaBзавжди є раніше aBa. Не алфавітно-цифрові символи, здається, також завжди ігноруються ( abcє раніше ab-x)

Приєднання, здається, очікує зворотне ... Але у мене є рішення

Насправді це пов'язано з послідовністю зіставлення: використання LANG=en_EN sort -k 1,1 <myfile> ...потім 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 використовує лише вказане поле як ключ.

Ви повинні виправити цю несумісність, обмеживши сортування, щоб використовувати лише той ключ, до якого потрібно приєднатися.

На сторінці "Приєднатися до людини" зазначено:

Важливо: FILE1 та FILE2 повинні бути відсортовані за полями з'єднання. Наприклад, використовуйте 'сортувати -k 1b, 1', якщо> 'приєднатися' не має жодних варіантів. Зауважте, порівняння враховують правила, визначені "LC_COLLATE". Якщо вхід> не відсортовано, а деякі рядки неможливо з'єднати, буде подано попереджувальне повідомлення.


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

Це вирішить вашу проблему. Проблема, на яку вказував @Michael, - це послідовність зіставлення, яка залежить від вашого налаштування LOCALE.


2

Зауважте, що якщо ви бачите цю помилку, і ви вже сортували по певній колонці і б’єте головою об стіну, наприклад, сортуйте -k4,4, тоді вам може знадобитися встановити роздільник для команди сортування.

Мабуть, OP вже зробив це з -t '', але для нормального тексту, розділеного на вкладку, я рекомендував би

sort -t $'\t' ...

Команда сортування за замовчуванням може містити пробіли як роздільники навіть у тому, що схоже на файл, розділений на вкладку (особливо якщо всередині стовпця, який ви сортуєте, є пробіли).

Тоді, якщо ви передали відсортовані дані для приєднання, і у вас є

join -t $'\t' ...

Тоді це закінчується причиною того, що повідомлення про помилку про його несортованість. Як зазначено вище, приєднання може не приймати -t '', хоча.


1

Для приєднання аргументу після -t є символом. Для сортування можна поставити більш довгий сепаратор сортування. Я думаю, що ви можете приєднати файли до іншого поля, яке ви хочете, і ігнорування справи вирішує проблему за збігом обставин.

І я погоджуюся з Жиллом, що дані вибірки були б корисними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.