Як об'єднати багаторядковий вихід, щоб сформувати єдиний рядок?


1

Я хочу приєднати різні вихідні лінії до одного рядка, як нижче.

$ cat new.txt | grep Full |  awk '{print $1}' 
09/01/2018
08/25/2018
08/18/2018
08/11/2018
08/04/2018
07/28/2018
07/21/2018

Я хочу приєднатися вище виводу до одного рядка, як

09/01/2018,08/25/2018

тощо.

Відповіді:


1
tr '\n' ',' | sed 's/,$/\n/'

trзамінює кожен символ нового рядка на ,, включаючи останній (після 07/21/2018). Потім sedзамінює ,в кінці з новим рядком , щоб сформувати POSIX-сумісної лінію без закривають ,.

Зверніть увагу sed, це інструмент для обробки тексту, який за замовчуванням працює з одним рядком одночасно. Що б не було листя tr- це одна лінія; це може бути дуже довгим, залежно від вашого вкладу, і sedможе бути вже не найкращим інструментом для вирішення цього питання.

Я б переглянув ідею мати всі результати в одному рядку, просто щоб уникнути такого сценарію. Існують способи заміни цього конкретного sedінструменту, що працює з байтами (а не рядками). Але навіть якщо ви це зробите тут, у вас все ще буде потенційно дуже довгий рядок, який незручно проаналізувати пізніше.

Гаразд, якщо вам дійсно потрібно це зробити, то використовуйте наступну команду для створення довільно великої лінії. Весь аналіз проводиться за допомогою інструментів, що працюють на байтах:

head -c -1 | tr '\n' ',' && printf '\n'

headзнімає останнього персонажа, ми сліпо припускаємо, що це новий рядок; trзмінює всі залишки нових рядків на ,символи; printfдодає зворотний новий рядок, щоб зробити ваш результат лінією, сумісною з POSIX.


2

Ти хочеш paste.

cat new.txt | grep Full |  awk '{print $1}' | paste -s -d,

Крім того, awk може робити те, що і кіт, і греп

awk '/Full/ {print $1}' new.txt | paste -s -d,

Крім того, awk може відформатувати вихід, але він менш читабельний:

awk '/Full/ {printf "%s%s", (NR == 1 ? "" : ","), $1} END {print ""}' new.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.