Превращение многострочной строки в одну запятую - PullRequest
73 голосов
/ 03 января 2012

Допустим, у меня есть следующая строка:

something1:    +12.0   (some unnecessary trailing data (this must go))
something2:    +15.5   (some more unnecessary trailing data)
something4:    +9.0   (some other unnecessary data)
something1:    +13.5  (blah blah blah)

Как мне превратить это просто в

+12.0,+15.5,+9.0,+13.5

в bash?

Ответы [ 16 ]

132 голосов
/ 04 января 2012

Чисто и просто:

awk '{print $2}' file.txt | paste -s -d, -
78 голосов
/ 03 января 2012

Вы можете использовать awk и sed:

awk -vORS=, '{ print $2 }' file.txt | sed 's/,$/\n/'

Или, если вы хотите использовать трубу:

echo "data" | awk -vORS=, '{ print $2 }' | sed 's/,$/\n/'

Чтобы разбить ее:

  • awk отлично справляется с обработкой данных, разбитых на поля
  • -vORS=, устанавливает «разделитель выходных записей» на ,, что вы и хотели
  • { print $2 } говорит awk напечатать второе поле для каждой записи (строки)
  • file.txt это ваше имя файла
  • sed просто избавляется от конечного , и поворачивает егов новую строку (если вы не хотите новой строки, вы можете сделать s/,$//)
10 голосов
/ 29 октября 2017
cat data.txt | xargs | sed -e 's/ /, /g'
10 голосов
/ 03 января 2012
$ awk -v ORS=, '{print $2}' data.txt | sed 's/,$//'
+12.0,+15.5,+9.0,+13.5

$ cat data.txt | tr -s ' ' | cut -d ' ' -f 2 | tr '\n' ',' | sed 's/,$//'
+12.0,+15.5,+9.0,+13.5
8 голосов
/ 03 января 2012

Это тоже должно работать

awk '{print $2}' file | sed ':a;{N;s/\n/,/};ba'
7 голосов
/ 03 января 2012

Это может работать для вас:

cut -d' ' -f5 file | paste -d',' -s
+12.0,+15.5,+9.0,+13.5

или

sed '/^.*\(+[^ ]*\).*/{s//\1/;H};${x;s/\n/,/g;s/.//p};d' file
+12.0,+15.5,+9.0,+13.5

или

sed 's/\S\+\s\+//;s/\s.*//;H;$!d;x;s/.//;s/\n/,/g' file

Для каждой строки в файле;отрежьте первое поле и следующие за ним пробелы, отрежьте оставшуюся часть строки после второго поля и добавьте к пробелу.Удалите все строки, кроме последней, где мы поменялись местами, и после удаления введенной новой строки в начале преобразуйте все новые строки в ,.

Примечание: можно записать:

sed 's/\S\+\s\+//;s/\s.*//;1h;1!H;$!d;x;s/\n/,/g' file
6 голосов
/ 30 октября 2017

awk один вкладыш

$ awk '{printf (NR>1?",":"") $2}' file

+12.0,+15.5,+9.0,+13.5
3 голосов
/ 19 апреля 2013

попробуйте это:

sedSelectNumbers='s".* \(+[0-9]*[.][0-9]*\) .*"\1,"'
sedClearLastComma='s"\(.*\),$"\1"'
cat file.txt |sed "$sedSelectNumbers" |tr -d "\n" |sed "$sedClearLastComma"

хорошо то, что легко удалить символы новой строки "\ n"!

РЕДАКТИРОВАТЬ: еще один отличный способ объединить строки в одну строку с помощью sed это: |sed ':a;N;$!ba;s/\n/ /g' получил от здесь .

2 голосов
/ 29 октября 2017

Не видел этого простого решения с awk

awk 'b{b=b","}{b=b$2}END{print b}' infile
2 голосов
/ 19 декабря 2016

Решение, написанное на чистом Bash:

#!/bin/bash

sometext="something1:    +12.0   (some unnecessary trailing data (this must go))
something2:    +15.5   (some more unnecessary trailing data)
something4:    +9.0   (some other unnecessary data)
something1:    +13.5  (blah blah blah)"

a=()
while read -r a1 a2 a3; do
    # we can add some code here to check valid values or modify them
    a+=("${a2}")
done <<< "${sometext}"
# between parenthesis to modify IFS for the current statement only
(IFS=',' ; printf '%s: %s\n' "Result" "${a[*]}")

Результат: + 12,0, + 15,5, + 9,0, + 13,5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...