Объединить несколько строк текстовых документов в одну

У меня есть тысячи текстовых документов, и они имеют различное количество строк текста. Я хочу объединить все строки в одну строку в каждом документе отдельно. Вот например:

abcd 
efgh 
ijkl

должен стать как

abcd efgh ijkl 

Я пытался использовать команды sed, но это не совсем то, что я хочу, так как количество строк в каждом документе варьируется. Пожалуйста, предложите, что я могу сделать. Я работаю над Python в Ubuntu. Однострочные команды будут очень полезны. заранее спасибо!

3 ответа

Решение

Если вы поместите ваш скрипт в тот же каталог, что и ваши файлы, следующий код должен работать.

import os
count = 0
for doc in os.listdir('C:\Users\B\Desktop\\newdocs'):
    if doc.endswith(".txt"):
        with open(doc, 'r') as f:
            single_line = ''.join([line for line in f])
            single_space = ' '.join(single_line.split())

        with open("new_doc{}.txt".format(count) , "w") as doc:
            doc.write(single_space)
        count += 1
    else:
        continue

Код @inspectorG4dget более компактен, чем мой, и поэтому я думаю, что он лучше. Я пытался сделать мой максимально удобным для пользователя. Надеюсь, поможет!

Использование Python не будет необходимым. Это делает трюк:

% echo `cat input.txt` > output.txt

Чтобы применить к группе файлов, вы можете использовать цикл. Например, если вы используете bash:

for inputfile in /path/to/directory/with/files/* ; do
    echo `cat ${inputfile}` > ${inputfile}2
done

Предполагая, что все ваши файлы находятся в одном каталоге, имеют расширение.txt и у вас есть доступ к Linux-блокам с bash, вы можете использовать tr следующим образом:

for i in *.txt ; do tr '\n' ' ' < $i > $i.one; done

для каждого файла "file.txt" будет создан файл "file.txt.one" со всем текстом в одной строке.

Если вам нужно решение, которое работает с файлами напрямую, вы можете использовать gnu sed (ЗАМЕТЬТЕ, ЧТОБЫ ЗАБЛОКИРОВАТЬ ВАШИ НАЧАЛЬНЫЕ ФАЙЛЫ - СДЕЛАЙТЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ СПРАВОЧНИКА ПЕРЕД ТЕМ, ЧТОБЫ ПОПРОБОВАТЬ)

sed  -i -n 'H;${x;s|\n| |g;p};' *.txt

Если ваши файлы не находятся в той же директории, вы можете использовать find с -exec:

find . -name "*.txt" -exec YOUR_COMMAND \{\} \;

Если это не сработает, может быть, помогут еще несколько деталей о том, что вы пытаетесь сделать.

Другие вопросы по тегам