Как исправить команду unix `join`, вставив ^ M между столбцами соединения? -unix

Я начинающий программист. Я использую команду join unix, чтобы объединить пару длинных файлов вместе.

 join -j30 test test2 col1 col2 ... col30 col1 col2 ... col30 AB ZZZ ^MAB ZZZ 

Я получаю этот символ ^M на выходе.

Почему он там? и как бы удалить его?

EDIT: Ниже представлен снимок экрана моей части моего вывода

введите описание изображения здесь

The ^ M означает, что вы переносите / редактируете файл в Windows.

Используйте команду dos2unix над файлами, чтобы преобразовать их в текстовый режим Unix.

DOS использует возврат каретки и строку «\ r \ n» в качестве окончания строки, в то время как Unix использует только строку «\ n». ^ M – это визуальное представление «лишних» символов.

Чтобы установить команду dos2unix , выполните (на дистрибутивах на основе Debian):

 sudo apt-get install dos2unix 

или на Mac (MacPorts):

 sudo port install dos2unix 

Кроме того, вы также можете сделать это с помощью sed, как в:

 sed 's/\r$//' dosfile.txt > unixfile.txt 

join(1) (по крайней мере, версия, которую я использую) не добавляет ^M или возвращает каретки в объединенные файлы; join , однако, с радостью скопирует ^M Экран hex viewer и некоторые тестовые примеры могут показать, что происходит:

 $ echo "1 a" > test1 $ echo "1 b" > test2 $ join test1 test2 | od -bc 0000000 061 040 141 040 142 012 1 ab \n 0000006 $ 

И тестовый пример, где во входных файлах есть ^M :

 $ perl -E "say qq(1 a\r)" > test1 $ perl -E "say qq(1 b\r)" > test2 $ join test1 test2 | od -bc 0000000 061 040 141 015 040 142 015 012 1 a \rb \r \n 0000010 $ 

Существуют различные способы исправления входных файлов, кроме dos2unix можно также использовать tr (хотя это было бы ужасной идеей, если файл использует древнюю традицию MacOS \r в качестве разделителя строк):

 $ od -bc test1 0000000 061 040 141 015 012 1 a \r \n 0000005 $ tr -d '\r' < test1 > foo $ mv foo test1 $ od -bc test1 0000000 061 040 141 012 1 a \n 0000004 $