2015-11-15 1 views
3

У меня есть пять файлов csv, которые я хотел бы с paste вместе с использованием функции оболочки. Это в основном выполняет конкатенацию строк в нескольких текстовых файлах. То, что я за ним, приведено в примере 8 in this tutorialКак использовать команду вставки unix/shell для нескольких файлов

Я делаю это с Python через subprocess.call(), однако выполнение этого непосредственно в терминале дает такие же запутывающие результаты.

Мои файлы все табуляции (который является разделителем по умолчанию функции вставки)

Когда я использую функцию на 2, 3, ... п файлов, то кажется, что заголовки второй к n'th файлам добавляются как вторая строка с заголовком только первого файла, появляющегося в первой строке.

Вот моя команда:

paste outfile.txt tmp_1.txt tmp_2.txt tmp_3.txt tmp_4 > final.txt 

Вот результат:

col1 col2 col3    # <-- 1st file has 3 columns 
col4 col5      # <-- 2nd file has 2 columns 
col6        # <-- 3rd file has 1 columns 
col7        # <-- 4th file has 1 columns 
col8 col9      # <-- 5th file has 2 columns 

После этого, однако, ряды вести по-другому (последовательно до конца файлов) :

col1 col2 col3 
col4 col5 col6 col6 col7 col8 col9 
col1 col2 col3 
col4 col5 col6 col6 col7 col8 col9 

[Эти два кодовых блоков следуют по друг от друга]

Я не могу найти больше опций, которые я мог указать в this documentation, явно вводя -d'\t' ничего не меняет. Я также пытался меньше или больше файлов, изменение Одера файлов (в случае, если мой первый один имеет несколько carrriage возвращаются и т.д. в нем, но результаты всегда одинаковы.

Update # 1

Вот кусок вывода команды на @shellter рекомендуется в комментариях: cat -vet file1.txt file2.txt ... file5.txt | less:

Col1^ICol2^ICol3^M$ 
Some text was here^I2^I-3^M$ 
Some text was here^I2^I-1^M$ 
Some text was here^I2^I-2^M$ 
Some text was here^I2^I-1^M$ 

Вы можете увидеть ^I маркеры для вкладок и ^M плюс $ для конца-строки/перевозки -return/newline.

обновление # 2

Применив функцию оболочки dos2unix мои файлы:

dos2unix file1.txt file2.txt ... file5.txt 

исходная функция пасты я изначально работает, как ожидалось. Из вывода окончательного файла мы можем видеть, какие маркеры остаются, являются только полезной сортировкой. Здесь желаемое из, достигается:

col1 col2 col3 col4 col5 col6 col6 col7 col8 col9 
col1 col2 col3 col4 col5 col6 col6 col7 col8 col9 
col1 col2 col3 col4 col5 col6 col6 col7 col8 col9 

А вот выход из функции, используемой для проверки: cat -vet file1.txt ...:

Col1^ICol2^ICol3^ICol4^ICol5^ICol6^Col7^ICol8^ICol9$ 
Col1^ICol2^ICol3^ICol4^ICol5^ICol6^Col7^ICol8^ICol9$ 
Col1^ICol2^ICol3^ICol4^ICol5^ICol6^Col7^ICol8^ICol9$ 

Нет ^M маркеры быть найдены.

+1

У вас есть какие-то окончания линии DOS, запутывающие вещи? То есть, у файлов есть окончания строк CRLF? Можете ли вы показать первые 3 или 4 строки каждого из 5 входных файлов? –

+1

Джонатан может быть на что-то. Используйте 'cat -vet файл ... file. | Less' и Ищите^M в конце каждой строки. Если вы видите это, выйдите из 'less', а затем используйте' dos2unix file file2 .... fileN'. Превосходно иллюстрированная проблема. Держите проводку, пожалуйста! Удачи. – shellter

+0

Спасибо, ребята, вы были правы. Команда @shellter показала, что строки имеют '^ M' в конце. Теперь у меня есть проблема, что я не могу установить dos2unix ... Я попытаюсь решить эту проблему, а затем вернуться. Тем временем я покажу первые строки одного из файлов в моем сообщении. –

ответ

1

Передача некоторых комментариев в ответ (Community Wiki).

Jonathan Leffler прокомментировал:

У вас есть какие-либо строки окончаний DOS запутанные вещи? То есть, у файлов есть окончания строк CRLF?

И shellter прокомментировал:

Используйте cat -vet file ... file | less и искать ^M в конце каждой строки.

Вы подтвердили, что это действительно было источником неприятностей.