Вопрос или проблема
Я хочу соединить все строки в одной строке в тексте. Я новичок в программировании и пытаюсь учиться, делая. Я потратил четыре часа, пытаясь решить эту проблему. Я знаю, что есть простое решение этой проблемы. Вот что я пробовал.
sed -e 'N;s/\n//' myfile.txt #Ничего не делает sed -e :a -e N -e 's/\n/ /' -e ta myfile.txt #результат перепутан, и я не могу понять синтаксис cat myfile.txt | tr -d '\n' > myfile.txt #удаляет все строки
Вот текстовый файл:
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"
Я не могу понять, где я ошибся….
tr
, как вы его использовали, должен работать и является самым простым — вам просто нужно вывести в другой файл. Если вы используете входной файл как выходной, результат будет пустым файлом, как вы и заметили;
cat myfile.txt | tr -d '\n' > oneline.txt
Необходимо помнить, что некоторые редакторы завершают строку символами \r\n
. В этом случае используйте
cat myfile | tr -d '\r\n'
ПРОСТОЙ МЕТОД
Другой метод с использованием awk,
awk '{print}' ORS='' myfile.txt
Вывод:
500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH
LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL)List
Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 Dec
200701 Jan 2008″
Примечание:
ORS=” -> ORS (Output Record Separator). (т.е.) ваш разделитель полей, вы можете иметь любые символы между одиночными кавычками в качестве разделителя полей.
С использованием этого метода awk мы можем включать пробелы и все символы.
Надеюсь, это может помочь!
GEDIT:
Ищите и заменяйте \n
на пробел ‘ ‘.
Вы можете получить окно замены, перейдя в ‘Поиск’->’Замена’
или с помощью сочетания клавиш Ctrl+H
Смотрите скриншот ниже:
Ваш оригинальный текст находится на строках 1-14.
Результат находится на строке 16.
Я думаю, что самый простой способ сделать это:
paste -s -d:" " test.txt
Нет необходимости помещать метку :a
вне основной инструкции, равно как и опция -e
не является необходимой; наконец, /$/
избыточна (у каждой строки есть символ EOL).
Улучшая другие ответы, получаем
sed -i ':a; N; s/\n/ /; ta' file
Это яснее, если написать следующим образом,
sed -i ':a
N
s/\n/ /
ta' file
Команда работает следующим образом:
N
добавляет следующую строку к (многострочному) пространству шаблона, которое уже содержит текущую строку;s/\n/ /
заменяет символ новой строки\n
, созданныйN
, пробелом;
ta
переходит к строке сценария, следующей за меткой:a
до тех пор, пока замена на шаге 2 была успешной, т.е., если замена произошла, выполнение прыгает к шагу 1 без “достижения” конца сценария, т.е. без чтения другой строки ввода.
Обратите внимание на следующее;
sed
читает строки входного файла по одной в порядке, начиная с 1-й строки;:a
это просто метка, а не команда для выполнения;N
по сути выполняется на любой строке, ноs/\n/ /
(в принципе выполняется на любой строке) успешно на любой строке, кроме последней, так чтоta
позволяет достичь конца сценария только когда последняя строка входных данных прочитана (единственная строка, гдеs
терпит неудачу), так что- никакая дальнейшая входная строка не читается в пространство шаблона после того, как 1-я строка прочитана в него, если только последняя не прочитана, но тогда нечего больше читать, и выполняется неявная команда
p
.
Таким образом, сценарий в основном читает 1-ю строку входных данных и продолжает добавлять следующие строки по одной, каждую раз заменяя символ новой строки пробелом; после того, как последняя строка добавлена (и \n
изменено на пробел), N
не может добавить строку, s
терпит неудачу, ta
пропускается, достигается конец сценария, и выполняется неявный оператор p
на текущем долгом 1-строчном пространстве шаблона.
Опция -i
заменяет входной файл file
на целое 1-строчное пространство шаблона.
Попробуйте это
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
http://anandsekar.github.io/joining-all-lines-in-a-file-using-sed/
Подход на Python:
python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt
AWK:
awk '{printf "%s ",$0}' /etc/passwd
Я думаю, вы просто забыли, что вам нужно было указать sed перенаправить вывод вашего файла yourfile.txt на желаемый результат, newfile.txt. Это кажется командой, которая вам нужна, но только если файлы, которые вы пытаетесь объединить, не слишком велики для буферов sed: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt
. Благодарность другому форуму здесь, где обсуждаются возможности sed. Я протестировал команду, и она сработала для меня.
Чистое bash решение:
while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt
На моем месте я бы просто открыл его в vim и нажал Shift+J несколько раз.
vim <your_file>
Введите в vim и нажмите Enter:
:% s/\n/ /g
Без использования подскриптов или внешних команд, что делает это довольно быстрым, по крайней мере, при небольших объемах чтения.
mapfile -t < file; echo "${MAPFILE[*]}" > file
То же самое можно достичь с помощью read
.
read -rd '' -a a < file; echo "${a[*]}" > file
.
Ответ или решение
Конечно, давайте разберем, как объединить все строки текстового файла в одну строку с использованием командных инструментов. Ваша задача вполне выполнима, даже с учетом того, что вы только начинаете свой путь в программировании. Ниже я приведу несколько различных методов для достижения этой цели, учитывая популярные инструменты для обработки текстовых данных.
1. Метод с использованием tr
Команда tr
предназначена для преобразования или удаления символов. Для объединения всех строк в одну, нам нужно удалить символы новой строки.
Пример команды:
cat myfile.txt | tr -d '\n' > oneline.txt
Объяснение:
cat myfile.txt
читает файлmyfile.txt
.tr -d '\n'
удаляет все символы новой строки.>
перенаправляет результат в новый файлoneline.txt
.
Важно отметить, что использовать тот же файл как входной и выходной рискованно, так как это приведет к потере данных.
2. Использование awk
awk
— это мощный инструмент для работы с текстовыми файлами.
Пример команды:
awk '{print}' ORS='' myfile.txt > oneline.txt
Объяснение:
ORS=''
устанавливает Output Record Separator (разделитель выходных записей) в пустую строку, что приводит к объединению всех выходных строк.
3. Команда sed
sed
может также быть использован для переработки и перенаправления текста.
Пример команды:
sed -e ':a' -e 'N' -e 's/\n/ /' -e 'ta' myfile.txt > oneline.txt
Объяснение:
:a
устанавливает метку дляsed
.N
объединяет следующую строку с текущей в пространстве шаблонов.s/\n/ /
заменяет символ новой строки (\n
) на пробел.ta
возвращается к меткеa
, если замена была успешной.
4. Использование Python
Python предоставляет гибкость и простоту в обработке текстовых данных.
Пример команды:
python -c "import sys; print(' '.join(line.strip() for line in sys.stdin))" < myfile.txt > oneline.txt
Объяснение:
- Скрипт на Python читает строки, убирает лишние пробелы и объединяет их в одну строку, разделяя пробелами.
Заключение
Каждый из предложенных методов требует понимания командной строки и инструментов, но обеспечивает решение вашей задачи. Простой способ — использовать tr
или awk
, тогда как sed
и Python предоставляют более гибкие возможности. Применение подходящего инструмента зависит от вашего предпочтения и привычек работы с системами.
Убедитесь, что вы создали резервную копию вашего файла перед выполнением операций, чтобы избежать потери данных.
Если у вас возникнут дополнительные вопросы по реализации, не стесняйтесь обращаться за помощью.