varias utilizar test solo siguientes regulares regresará que puede parametros palabras palabra líneas los expresiones exacta cuál con comiencen comandos comando caracteres buscar linux string bash shell csv

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 a awk 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 hacer s/,$// )

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''