Как мне объединить все строки в текстовом файле в одну строку?

Я хочу собрать все строки в тексте в одну строку. Я новичок в программировании, пытающийся учиться на практике. Я провел четыре часа, пытаясь решить эту проблему. Я знаю, что есть простое решение этой проблемы. Вот что я пытался

sed -e 'N;s/\n//' myfile.txt #Does nothing

sed -e :a -e N -e 's/\n/ /' -e ta myfile.txt #output all messed up and I can't make head nor tail of the syntax

cat myfile.txt | tr -d '\n' > myfile.txt # Deletes all lines

Вот текстовый файл:

500212
262578-4-4
23200
GRIFFITH LABORATORIES LTD
GRIFFITH LABORATORIES
SOUTH DUBLIN COUNTY COUNCIL
OFFICE
OFFICE (INDUSTRIAL)
List Rateable
2 Pineview Industrial Estate
Firhouse Road
Knocklyon
31 Dec 2007
01 Jan 2008"   

Я не могу понять, где я ошибся ....

28
задан 18 January 2018 в 19:45

12 ответов

tr, как вы его использовали , должно работать и является самым простым - вам просто нужно вывести в другой файл . Если вы используете входной файл в качестве выходного, результатом будет пустой файл, как вы заметили;

cat myfile.txt | tr -d '\n' > oneline.txt

Вы должны помнить, что некоторые редакторы заканчивают строку с \r\n. Для этого случая используйте

cat myfile | tr -d '\r\n'
0
ответ дан 18 January 2018 в 19:45

Попробуйте это

sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]

http://anandsekar.github.io/joining-all-lines-in-a-file-using-sed/

0
ответ дан 18 January 2018 в 19:45

Вот оно. Это еще одно решение, простое и легкое.

echo $(cat Input.txt) > Output.txt
0
ответ дан 18 January 2018 в 19:45

GEDIT:

Поиск и замена \n с пространством ''.
Можно получить окно замены путем попытки 'Искать '->'Replace'
или через keybpard ярлык Ctrl+H

См. снимок экрана ниже:

Ваш оригинальный текст находится на строках 1-14.
Результат находится на строке 16.

enter image description here

2
ответ дан 18 January 2018 в 19:45

Нет никакой потребности поместить маркировку :a за пределами основной инструкции ни один не -e опция, необходимая необходимый; наконец, /$/ является лишним (каждая строка имеет символ EOL).

Улучшая другие ответы, каждый добирается

sed -i ':a; N; s/\n/ /; ta' file

Который более ясен, если записано следующим образом,

sed -i ':a
        N
        s/\n/ /
        ta' file

Команда работает следующим образом:

  1. N добавляет следующую строку к (многострочному) пространству шаблона, которое уже содержит текущую строку;
  2. s/\n/ / замените символом новой строки \n сгенерированный N с пространством ;
  3. ta переходит к строке сценария после маркировки :a пока замена на шаге 2 была успешна, т.е. если замена произошла, переходы выполнения к шагу 1, не "поражая" конец сценария, т.е. не читая другую строку входа.

Отметьте следующее;

  • sed читает строки входного файла один за другим в порядке, начинающем с 1-й строки;
  • :a просто маркировка, не команда, которая будет выполняться;
  • N в принципе, выполняется на любой строке, но
  • s/\n/ / (в принципе выполняемый на любой строке), успешно на любой строке, но последней, таким образом,
  • ta делает конец сценария достижимым только, когда последняя строка входа читается (единственная строка, где s сбои), таким образом,
  • не далее входная строка читается в пространство шаблона после того, как 1-й читается в него, если последний не читается в, но затем нет никакой дальнейшей строки для чтения в, и неявное p команда выполняется.

Таким образом, сценарий в основном читает в 1-й строке входа и продолжает добавлять следующие строки один за другим, каждый раз заменяя новой строкой с пространством; после того, как последняя строка добавляется (и \n измененный в пространстве), N не может добавить строку, s сбои, ta пропускается, конец сценария достигнут, и подразумеваемое pоператор rint выполняется на текущем looong пространстве шаблона с 1 строкой.

-i опция заменяет входным файлом file с целым пространством шаблона с 1 строкой.

3
ответ дан 18 January 2018 в 19:45

Я думаю, что самый простой способ сделать это:

paste -s -d:" " test.txt

http://ss64.com/bash/paste.html

0
ответ дан 18 January 2018 в 19:45

ПРОСТОЙ МЕТОД

Другой метод с помощью awk,

cat myfile.txt | awk '{print}' ORS=''

Вывод:

ЛАБОРАТОРИИ 500212262578-4-423200GRIFFITH графство LTDGRIFFITH LABORATORIESSOUTH ДУБЛИН COUNCILOFFICEOFFICE (ПРОМЫШЛЕННЫЙ) Rateable2 Pineview списка промышленный декабрь EstateFirhouse RoadKnocklyon31 200 701 январь 2008"

Примечание:

ORS =''-> Это - Ваш разделитель полей, у Вас может быть любой промежуток символов одинарные кавычки как разделитель полей. Используя этот awk метод мы можем включать пробелы и все символы.

Надежда это могло бы помочь!

3
ответ дан 18 January 2018 в 19:45

Я думаю, вы просто забыли, что вам нужно было сказать sed перенаправить вывод yourfile.txt на нужный результат, newfile.txt. Похоже, эта команда вам нужна, но только если файлы, которые вы пытаетесь объединить, не слишком велики для буферов sed: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Благодарим другой форум здесь , где они обсуждают возможности sed. Я проверил команду, и она сработала для меня.

0
ответ дан 18 January 2018 в 19:45

Чистое решение для bash:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt
0
ответ дан 18 January 2018 в 19:45

Если бы это был я, я бы просто открыл его в vim и нажал несколько раз Shift + J .

0
ответ дан 18 January 2018 в 19:45
vim <your_file>

Введите в vim и нажмите Enter:

:% s/\n/ /g
0
ответ дан 18 January 2018 в 19:45

Подход Python:

python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
0
ответ дан 18 January 2018 в 19:45

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

Похожие вопросы: