Як об'єднати всі рядки в текстовому файлі в один рядок?


28

Я хочу зв'язати всі рядки в тексті в один рядок. Я початківець з кодування, намагаючись вчитися на практиці. Я провів чотири години, намагаючись вирішити цю проблему. Я знаю, що тут є просте рішення цієї проблеми. Ось що я намагався.

sed -e 'N; s / \ n //' myfile.txt # Не робить нічого

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

кішка myfile.txt | tr -d '\ n'> myfile.txt # Видаляє всі рядки

Ось текстовий файл:

500212
262578-4-4
23200
GRIFFITH LABORATORIES LTD
ЛАБОРАТОРІЇ ГРИФФІТА
РАДА ЮЖНОЇ ДУБЛІНСЬКОЇ КРАЇНИ
ОФИС
ОФИС (ПРОМИСЛОВО)
Список підлягає оцінці
2 Промислова нерухомість Pineview
Фірхаус Роуд
Нокльйон
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". Знову дякую.
Джон

@John: Ви не можете використовувати те саме ім'я вихідного файлу !! (див. відповідь). Будь ласка , спробуйте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- уникнути марного використання кота та використання однієї менш непотрібної труби.
злий

8

Ось. Це ще одне рішення і просте легко.

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

2
я не можу повірити, що це спрацювало, дивовижно
mchid

echo `cat Input.txt` > Output.txt працює також, просто ще один варіант
raider33

Якщо в одному поділі буде більше ОДних білих пробілів (пробіл, вкладка, новий рядок тощо), вони будуть замінені пробілом.
iBug

Це приємне рішення, але на моєму комп’ютері я виявив, що це потребує приблизно трьох разів більше часу, ніж trрішення.
LS

3

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

Інший метод за допомогою awk,

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

Вихід:

500212262578-4-423200GRIFFITH ЛАБОРАТОРІЇ LTDGRIFFITH ЛАБОРАТОРІЇ ПО ДУБІНСЬКІЙ КРАЇНСЬКІЙ РАДІ (ПРОМИСЛОВОСТІ) Список Оцінка2 Pineview Промислова нерухомістьФірхальна дорогаKnocklyon31 грудень 200701 січня 2008 р. "

Примітка:

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виконується неявна команда.

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

-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
Насправді sed з -iкомутатором змінить вбудований початковий файл , тому немає необхідності виводити його в інший файл. Будьте уважні, хоча!
Останній

Я спробував sed -e: a -e N -e 's / \ n / /' -e ta reval_details.asp? Pno = 500214.txt 01 січня 2008 рокупромислова нерухомість sed -i: a -e N -e 's / \ n / / '-e ta 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: a -e N -i 's / \ n / /' -e ta reval_details .asp? pno = 500214.txt sed: не вдається прочитати s / \ n / /: немає такого файлу чи каталогу # будь-які ідеї.
Джон

@Mik У мене ще не пощастило, але дякую за відповідь.
Джон

Я скопіював і вставив ваш текст у текстовий редактор і зберег файл, потім застосував мою команду sed, і це зробило, що все це з’являється в одному рядку, коли відкривається в нано; однак якщо ви відкриєте файл за допомогою кота в терміналі, він буде завернутий і не виявиться лише одним рядком, тому, можливо, саме так і відбувається. Крім того, вам не потрібно 'перед sed, і я думаю, що ви додали в команду вище деякі непотрібні елементи, тому спробуйте sed -e: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt Рядок настільки довгий, що він буде відображатися на екрані, однак, якщо у вас немає монітора 30+ дюймів!

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

0

Чистий розчин башмаку:

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



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.