Превращение многострочной строки в одну запятую - 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 ]

2 голосов
/ 17 декабря 2015

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

grep -o "+\S\+" in.txt | tr '\n' ','

, который находит строку, начинающуюся с +, за которой следует любая строка \S\+, затем преобразует символы новой строки в запятые. Это должно быть довольно быстро для больших файлов.

0 голосов
/ 10 августа 2018

Что ж, наверное, самая сложная часть - это выбрать второй «столбец», так как я не знаю простого способа обработки нескольких пробелов как одного.В остальном это легко.Используйте замены bash.

# cat bla.txt
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)

# cat bla.sh
OLDIFS=$IFS
IFS=$'\n'
for i in $(cat bla.txt); do
  i=$(echo "$i" | awk '{print $2}')
  u="${u:+$u, }$i"
done
IFS=$OLDIFS
echo "$u"

# bash ./bla.sh
+12.0, +15.5, +9.0, +13.5
0 голосов
/ 15 сентября 2015

Другое решение Perl, похожее на awk Дана Фего:

perl -ane 'print "$F[1],"' file.txt | sed 's/,$/\n/'

-a говорит Perl разбить строку ввода на массив @F, который индексируется начиная с 0.

0 голосов
/ 03 января 2012

Вы также можете напечатать так:

Просто awk: используя printf

bash-3.2$ cat sample.log
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)

bash-3.2$ awk ' { if($2 != "") { if(NR==1) { printf $2 } else { printf "," $2 } } }' sample.log
+12.0,+15.5,+9.0,+13.5
0 голосов
/ 03 января 2012

Вы также можете сделать это с помощью двух вызовов sed:

$ cat file.txt 
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)
$ sed 's/^[^:]*: *\([+0-9.]\+\) .*/\1/' file.txt | sed -e :a -e '$!N; s/\n/,/; ta'
+12.0,+15.5,+9.0,+13.5

Первый вызов sed удаляет неинтересные данные, а второй объединяет все строки.

0 голосов
/ 03 января 2012

С perl:

fg@erwin ~ $ perl -ne 'push @l, (split(/\s+/))[1]; END { print join(",", @l) . "\n" }' <<EOF
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)
EOF

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