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


28

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

sed -e 'N; s / \ n //' myfile.txt # ничего не делает

sed -e: -e N -e 's / \ n / /' -e ta myfile.txt #output все испорчено, и я не могу понять ни синтаксис, ни голову

кошка myfile.txt | tr -d '\ n'> myfile.txt # Удаляет все строки

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

500212
262578-4-4
23200
ГРИФФИТ ЛАБОРАТОРИЗ, ООО
GRIFFITH LABORATORIES
СОВЕТ ЮЖНОЙ ДУБЛИНЫ
ОФИС
ОФИС (ПРОМЫШЛЕННЫЙ)
Список оцениваемых
2 Пайнвью Индастриал Эстейт
Firhouse Road
Ноклайн
31 декабря 2007 г.
01 января 2008 года "   

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

Ответы:


31

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

кошка myfile.txt | tr -d '\ n'> oneline.txt

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

cat myfile | tr -d '\r\n'

Спасибо за вашу помощь, но она все еще не работает. Я знаю, что это что-то простое и простое. Команда, которую вы дали, удалила все строки. Я собираюсь отправить файл 500212 262578-4-4 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATORIES ЮЖНЫЙ ОКРУГ DUBLIN СОВЕТ OFFICE OFFICE (INDUSTRIAL) Список соответственный 2 Pineview Industrial Estate Фёрхаус Дорога Ноклайн 31 Дек 2007 01 Янв 2008
John

@JOhn: Каков результат или ошибка?
Иш

Я собирался опубликовать, отредактировав свой ответ. После того, как я использовал команду, файл был пустым. В терминале это выглядело так: "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt". Еще раз спасибо.
Джон

@ Джон: Вы не можете использовать одно и то же имя выходного файла! (см. ответ). Пожалуйста , попробуйтеcat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
иш

1
Лучший способ сделать это tr -d '\n' <input.txt > output.txt- избежать ненужного использования cat и использовать одну менее ненужную трубу.
evilsoup

8

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

echo $(cat Input.txt) > Output.txt

2
я не могу поверить, что это сработало, потрясающе
Mchid

echo `cat Input.txt` > Output.txt тоже работает, просто другой
вариант

Если в одном делении больше, чем ОДИН пробел (пробел, табуляция, новая строка и т. Д.), Они будут заменены пробелом.
iBug

Это хорошее решение, но я обнаружил, что на моем компьютере оно работает примерно в три раза дольше, чем trрешение.
LS

4

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

Еще один метод с использованием awk,

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

Выход:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL) Список Сценный2 Пайнвью

Заметка:

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

Надеюсь, это может помочь!


1
ORS - это разделитель выходных записей. OFS - это разделитель выходного поля. См. Thegeekstuff.com/2010/01/… илиman awk
Старейшина Гик

3

Нет необходимости помещать метку :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 выполняется в текущем однолинейном пространстве шаблона ,

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


2

GEdit:

Найдите и замените \nпробел ''.
Вы можете получить окно замены, перейдя в «Поиск» -> «Заменить»
или с помощью сочетания клавиш Ctrl+H

Смотрите скриншот ниже:

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

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




0

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


1
На самом деле, СЭД с -iпереключателем меняет исходный файл в линию , так что нет необходимости выводить в другой файл. Будьте осторожны, хотя!
Иш

Я пробовал sed -e: -e N -e 's / \ n / /' -e ta reval_details.asp? Pno = 500214.txt 01 января 2008промышленное sed -i: a -e N -e 's / \ n / / '-e та reval_details.asp? Pno = 500214.txt sed: не могу найти метку для перехода к a' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to ' sed -e: -e N -i 's / \ n / /' -e та reval_details .asp? Pno = 500214.txt sed: не могу прочитать s / \ n / /: нет такого файла или каталога # Есть идеи.
Джон

@Мик Мне все еще не повезло, но спасибо за ответ.
Джон

Я скопировал и вставил ваш текст в текстовый редактор и сохранил файл, затем использовал мою команду sed, и он заставил все это появиться на одной строке при открытии в nano; однако если вы откроете файл с помощью cat в терминале, он будет обернут и не будет выглядеть как одна строка, так что, возможно, именно это и происходит. Кроме того, вам не нужен 'before sed, и я думаю, что вы добавили некоторые другие ненужные элементы в команду выше, поэтому попробуйте sed -e: -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt Строка такая длинная, что на экране она будет отображаться обернутой, если только у вас нет 30-дюймового монитора!

@Mik Приветствия за пост. Я набрал свои данные в текстовом редакторе, сохранил их и запустил 'sed -e: -e N -e' s / \ n / / '-e ta abc.txt> abc1.txt', и это сработало. в совершенстве. Аллилуйя. Затем я набрал 'sed -e: -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt', и каждая строка, кроме первой, имела пробел добавлен в начало строки. Я ценю ваши усилия, но думаю, что я перейду к октаве и попытаюсь обработать данные там.
Джон

0

Чистое решение Bash:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt

0

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



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.