linux - utilizar - Bash convirtiendo cadena de varias líneas en una sola coma separada
grep varias palabras (15)
Digamos que tengo la siguiente cadena:
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)
¿Cómo puedo convertir eso en simplemente
+12.0,+15.5,+9.0,+13.5
en bash?
Con 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
Esto debería funcionar también
awk ''{print $2}'' file | sed '':a;{N;s//n/,/};ba''
Esto podría funcionar para usted:
cut -d'' '' -f5 file | paste -d'','' -s
+12.0,+15.5,+9.0,+13.5
o
sed ''/^.*/(+[^ ]*/).*/{s///1/;H};${x;s//n/,/g;s/.//p};d'' file
+12.0,+15.5,+9.0,+13.5
Limpio y simple:
awk ''{print $2}'' < file.txt | paste -s -d, -
No veo esta solución simple con awk
awk ''b{b=b","}{b=b$2}END{print b}'' infile
Otra solución de Perl, similar a la de awk de Dan Fego:
perl -ane ''print "$F[1],"'' file.txt | sed ''s/,$//n/''
-a
le dice a Perl que divida la línea de entrada en la matriz @F, que está indexada comenzando en 0.
Puedes usar awk
y sed
:
awk -vORS=, ''{ print $2 }'' file.txt | sed ''s/,$//n/''
O si quieres usar un tubo:
echo "data" | awk -vORS=, ''{ print $2 }'' | sed ''s/,$//n/''
Para descomponerlo:
-
awk
es excelente en el manejo de datos desglosados en campos -
-vORS=,
establece el "separador de registros de salida" en, que es lo que quería -
{ print $2 }
le dice aawk
que imprima el segundo campo para cada registro (línea) -
file.txt
es tu nombre de archivo -
sed
simplemente se deshace del final y lo convierte en una nueva línea (si no quieres una nueva línea, puedes hacers/,$//
)
Puedes usar grep
:
grep -o "+/S/+" in.txt | tr ''/n'' '',''
que encuentra la cadena que comienza con +
, seguida de cualquier cadena /S/+
, luego convierte los nuevos caracteres de línea en comas. Esto debería ser bastante rápido para archivos grandes.
También puede hacerlo con dos llamadas 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
La primera llamada sed elimina datos poco interesantes, y la segunda une todas las líneas.
También puede imprimir así:
Solo awk: usando 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
Una solución escrita en puro 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[*]}")
Resultado: + 12.0, + 15.5, + 9.0, + 13.5
prueba esto:
sedSelectNumbers=''s".* /(+[0-9]*[.][0-9]*/) .*"/1,"''
sedClearLastComma=''s"/(.*/),$"/1"''
cat file.txt |sed "$sedSelectNumbers" |tr -d "/n" |sed "$sedClearLastComma"
¡Lo bueno es la parte fácil de eliminar caracteres de nueva línea "/ n"!
EDITAR: otra gran manera de unir líneas en una sola línea con sed es la siguiente: |sed '':a;N;$!ba;s//n/ /g''
obtenido desde here .
awk un trazador de líneas
$ awk ''{printf (NR>1?",":"") $2}'' file
+12.0,+15.5,+9.0,+13.5
$ 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
cat data.txt | xargs | sed -e ''s/ /, /g''