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?
listOfStuff mkString ", "
o Haskellintercalate ", " listOfString
Respuestas:
Puede utilizar
awk
ysed
:O si quieres usar una pipa:
Para desglosarlo:
awk
es excelente para manejar datos desglosados en campos-vORS=,
establece el "separador de registros de salida" en,
, que es lo que deseaba{ print $2 }
diceawk
que imprima el segundo campo para cada registro (línea)file.txt
es tu nombre de archivosed
simplemente se deshace del final,
y lo convierte en una nueva línea (si no desea una nueva línea, puede hacerlos/,$//
)fuente
awk -v ORS=| '{ print $1 }' DCMC.rtf | sed 's/,$/\n/'
Recibo un error{print $1}
contrario, solo obtengo comas en la salidaLimpio y simple:
fuente
cat thing | awk -F',' '{ print "'\''" $7 "'\' '" }' | paste -s -d ','
,'
como delimitador?dos2unix
) si hay CRLF en la cadena.fuente
fuente
function | awk...
su ejemplo?awk una línea
fuente
Esto también debería funcionar
fuente
Esto podría funcionar para ti:
o
o
Para cada línea del archivo; corte el primer campo y los espacios siguientes, corte el resto de la línea que sigue al segundo campo y añádalo al espacio de espera. Elimina todas las líneas excepto la última donde cambiamos al espacio de espera y después de eliminar la nueva línea introducida al principio, convertimos todas las líneas nuevas en
,
's.NB Podría escribirse:
fuente
Puede utilizar
grep
:que encuentra la cadena que comienza con
+
, seguida de cualquier cadena\S\+
, luego convierte los caracteres de nueva línea en comas. Esto debería ser bastante rápido para archivos grandes.fuente
Prueba este sencillo código:
fuente
prueba esto:
¡Lo bueno es la parte fácil de eliminar caracteres de nueva línea "\ n"!
EDITAR: otra excelente manera de unir líneas en una sola línea con sed es esta:
|sed ':a;N;$!ba;s/\n/ /g'
obtenido desde aquí .fuente
Una solución escrita en puro Bash:
Resultado: + 12.0, + 15.5, + 9.0, + 13.5
fuente
No veo esta sencilla solución con awk
fuente
Con perl:
fuente
También puedes hacerlo con dos llamadas sed:
La primera llamada sed elimina los datos poco interesantes y la segunda une todas las líneas.
fuente
También puede imprimir así:
Solo awk: usando printf
fuente
Otra solución de Perl, similar al awk de Dan Fego:
-a
le dice a perl que divida la línea de entrada en la matriz @F, que está indexada a partir de 0.fuente
Bueno, la parte más difícil probablemente sea seleccionar la segunda "columna", ya que no conocería una manera fácil de tratar varios espacios como uno solo. Por lo demás, es fácil. Usa sustituciones de bash.
fuente