Мой хрустальный шар говорит, что ваши текстовые файлы в формате DOS, с окончанием перевода строки (CR LF).Вот почему ваш вывод выглядит немного странно при печати на консоли.
Чтобы исправить это, конвертируйте файлы в формат unix.(У вас может быть команда dos2unix
; или, если вы уже используете vim, попробуйте :set ff=unix
; или perl -i -pe 's/\r//' file.txt
сделает это в крайнем случае.)
Примеры файлов в вашей ссылкес дополнительными возвратами каретки:
file1.txt
1 John\r
2 Jane\r
3 Mary\r
file2.txt
1 Doe\r
2 Doe\r
3 Sue\r
(Использование\r
для представления возврата каретки.)
Теперь, когда вы запустите join file1.txt file2.txt
, он сначала сравнит первое поле первой строки в каждом файле.Это успешно (1
с обеих сторон), поэтому join
выводит общее поле, пробел, оставшиеся поля из файла 1, другой пробел, а затем оставшиеся поля из файла 2. Итак, первая строка вывода -
1 John\r Doe\r
(\r
интерпретируется как часть полевых данных).
Но подождите!\r
не является печатным символом.Это приводит к перемещению курсора назад к началу строки при печати на терминале.Используя ^
, чтобы отметить позицию курсора, мы получаем следующий эффект:
1
^
1
^
1 J
^
1 Jo
^
1 Joh
^
1 John
^
Здесь мы печатаем первый возврат каретки, перемещаякурсор назад:
1 John
^
Следующий выводимый символ (пробел) перезаписывает 1
:
John
^
DJohn
^
Doohn
^
Doehn
^
Еще один возврат каретки, но этотодин не имеет видимого эффекта:
Doehn
^
И ... готово.
Другие строки обрабатываются аналогичным образом.Каждый раз, когда возврат каретки в конце последнего поля файла 1 перемещает курсор назад, поэтому поля из файла 2 перезаписывают то, что уже есть на экране.