Превращение многострочной строки в одну запятую
Скажем, у меня есть следующая строка:
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?
Ответы
Ответ 1
Вы можете использовать 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/,$//
)
Ответ 2
Чисто и просто:
awk '{print $2}' file.txt | paste -s -d, -
Ответ 3
cat data.txt | xargs | sed -e 's/ /, /g'
Ответ 4
$ 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
Ответ 5
Это тоже должно работать
awk '{print $2}' file | sed ':a;{N;s/\n/,/};ba'
Ответ 6
Это может работать для вас:
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
Для каждой строки в файле; отрежьте первое поле и следующие за ним пробелы, отрежьте оставшуюся часть строки после второго поля и добавьте к пробелу. Удалите все строки, кроме последней, где мы поменялись местами для удержания, и после удаления введенной новой строки в начале преобразуйте все новые строки в ,
's.
NB Может быть написано:
sed 's/\S\+\s\+//;s/\s.*//;1h;1!H;$!d;x;s/\n/,/g' file
Ответ 7
awk один лайнер
$ awk '{printf (NR>1?",":"") $2}' file
+12.0,+15.5,+9.0,+13.5
Ответ 8
попробуйте следующее:
sedSelectNumbers='s".* \(+[0-9]*[.][0-9]*\) .*"\1,"'
sedClearLastComma='s"\(.*\),$"\1"'
cat file.txt |sed "$sedSelectNumbers" |tr -d "\n" |sed "$sedClearLastComma"
Хорошая вещь - это легкая часть удаления символов новой строки \n "
EDIT: еще один отличный способ объединить строки в одну строку с sed: |sed ':a;N;$!ba;s/\n/ /g'
получен из здесь.
Ответ 9
Вы можете использовать grep
:
grep -o "+\S\+" in.txt | tr '\n' ','
который находит строку, начинающуюся с +
, за которой следует любая строка \S\+
, а затем преобразует новые символы строки в запятую. Это должно быть довольно быстро для больших файлов.
Ответ 10
Решение, написанное в чистом виде 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
Ответ 11
Не вижу этого простого решения с awk
awk 'b{b=b","}{b=b$2}END{print b}' infile
Ответ 12
С perl:
[email protected] ~ $ 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
Ответ 13
Вы также можете сделать это с помощью двух вызовов 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 удаляет неинтересные данные, а второй соединяет все строки.
Ответ 14
Вы также можете печатать следующим образом:
Просто 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
Ответ 15
Другое решение Perl, похожее на Dan Fego awk:
perl -ane 'print "$F[1],"' file.txt | sed 's/,$/\n/'
-a
сообщает perl разбивать входную строку на массив @F, который индексируется начиная с 0.
Ответ 16
Что ж, самой сложной частью, вероятно, является выбор второго "столбца", поскольку я не знаю простого способа обработки нескольких пробелов как одного. В остальном это легко. Используйте замены 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
Ответ 17
Попробуйте этот простой код:
awk '{printf("%s,",$2)}' File1