bash / sed / awk / тощо видалити всі інші рядки


39

команди bash видають це:

Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active

Я хотів би передати це чимось, щоб він виглядав так:

Runtime Name: vmhba2:C0:T1:L14 Group State: active 
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]

тобто видаліть кожен інший новий рядок

Я спробував, ... |tr "\nGroup" " "але це видалило всі нові рядки, а також з'їв деякі інші літери. Спасибі


2
trповністю базується на характері: ви попросили tr видалити нові рядки та всі 'G', 'r', 'o', 'u' та 'p'.
Гленн Джекман

Відповіді:


80

зараз не можна перевірити, але

... | paste - - 

повинен це зробити


5
+1 - працює і елегантно. (Він ставить вкладку між рядками - paste -d ' ' - -замість цього додасть пробіл)
cyberx86

4
Чи можете ви поясніть, як працює команда? Чому їх два -? Дякую
bbaja42

7
pasteвикористовуються для конкатенації відповідних рядків з файлів: paste file1 file2 file3 .... Якщо одним із аргументів "файла" є "-", рядки читаються зі стандартного введення. Якщо є 2 "-" аргументи, то вставлення займає 2 рядки від stdin. І так далі. Дивіться сторінку чоловіка .
Гленн Джекман


8

Якщо ви хочете використовувати sed, немає жодної причини читати весь файл в пам'яті. Ви можете об'єднати будь-який інший рядок так:

sed 'N;s/\n/ /' inputfile

Використовуйте будь-який символ, який хочете замість пробілу.

Ось ще один спосіб використання awk:

awk '{printf "%s", $0; if (getline) print " " $0; else printf "\n"}' inputfile

У if/elseрічках випадку , коли є непарна кількість рядків у файлі. Без цього непарний останній рядок надрукується двічі. В іншому випадку для порівняння ви можете зробити:

awk '{printf "%s", $0; getline; print " " $0}'

1
Пізній коментар: 1) завжди використовуйте специфікатор формату для printf, якщо рядок має знаки відсотка; 2) щоб уникнути дублювання останнього рядка, встановіть $ 0 на "" -awk '{printf "%s", $0; $0=""; getline; print " " $0}'
glenn jackman

3

Найбільш ідіоматичний спосіб зробити це awk:

awk 'ORS=NR%2?FS:RS' file

Він виводить:

Runtime Name: vmhba2:C0:T3:L14 Group State: active
Runtime Name: vmhba3:C0:T0:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14 Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14 Group State: active
Runtime Name: vmhba2:C0:T2:L14 Group State: active

Для його пояснення нам потрібно визначити кожну з вбудованих змінних:

  • RSроздільник записів. За замовчуванням \n(новий рядок).
  • ORSроздільник записів виводу. За замовчуванням \n(новий рядок).
  • FSроздільник поля. За замовчуванням (пробіл).
  • NR кількість запису.

Оскільки роздільником записів за замовчуванням є новий рядок, запис є, за замовчуванням, рядком.

NR%2є модулем NR/2, так що він буде 0або 1. 0для парних ліній і 1для непарних ліній.

var=condition?condition_if_true:condition_if_false є потрійним оператором.

Всі разом, кажучи, ORS=NR%2?FS:RSми визначаємо роздільник записів вихідних даних:

  • якщо кількість записів знаходиться на формі 2k + 1, тобто на парних рядках, то роздільники записів виводу встановлюються на FS, тобто пробіл.
  • якщо кількість записів у формі 2k, тобто на непарних рядках, то роздільники записів виводу встановлюються на RS, тобто новий рядок.

Таким чином, непарні лінії закінчуються пробілом, який потім з'єднується з наступним рядком. Після цього рядка друкується новий рядок.

Більше інформації в Idiomatic awk .


2

Це працює для мене в Linux:

... | tr "\\n" " "

Це замінює порожнє місце для символу нового рядка; Ви повинні уникати символу нового рядка, щоб речі працювали правильно.


Це видаляє кожну нову лінію, а не кожну іншу .
Трентон


1

Якщо Perl - це варіант:

perl -pe 's/\n/ / if $. % 2 == 1' file

s/\n/ /замінює новий рядок пробілом
$.номер рядка


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