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

и т.п.

2 ответа2

2

Вы хотите paste.

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

Кроме того, awk может делать то же, что и cat, и grep, поэтому

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

Кроме того, awk может отформатировать вывод, но он менее читабелен:

awk '/Full/ {printf "%s%s", (NR == 1 ? "" : ","), $1} END {print ""}' new.txt
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-совместимой строкой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .