Puede agregar comillas con sed y luego fusionar líneas con pegar , así:
sed 's/^\|$/"/g'|paste -sd, -
Si está ejecutando un sistema basado en GNU coreutils (es decir, Linux), puede omitir el '-'
final .
Si ingresa datos que tienen terminaciones de línea de estilo DOS (como sugirió @phk), puede modificar el comando de la siguiente manera:
sed 's/\r//;s/^\|$/"/g'|paste -sd, -
Usando
awk
:awk 'BEGIN { ORS="" } { print p"'"'"'"$0"'"'"'"; p=", " } END { print "\n" }' /path/to/list
Alternativa con menos escapes de shell y por lo tanto más legible:awk 'BEGIN { ORS="" } { print p"\047"$0"\047"; p=", " } END { print "\n" }' /path/to/list
Salida:'d3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'
Explicación:
El awk
el script en sí sin todos los escapes es BEGIN { ORS="" } { print p"'"$0"'"; p=", " } END { print "\n" }
. Después de imprimir la primera entrada, la variable p
está configurado (antes de eso es como una cadena vacía). Con esta variable p
cada entrada (o en awk
-hablar:grabar ) tiene el prefijo y además se imprime con comillas simples a su alrededor. El awk
variable separadora de registros de salida ORS
no es necesario (ya que el prefijo lo hace por usted) por lo que está configurado para estar vacío en el BEGIN
En g. Ah, y podríamos llevar nuestro archivo a END
con una nueva línea (por ejemplo, para que funcione con otras herramientas de procesamiento de texto); si esto no fuera necesario, la parte con END
y todo lo que sigue (dentro de las comillas simples) se puede eliminar.
Si tiene terminaciones de línea al estilo de Windows/DOS (\r\n
), tienes que convertirlos a estilo UNIX (\n
) primero. Para ello puedes poner tr -d '\015'
al comienzo de su embudo:
tr -d '\015' < /path/to/input.list | awk […] > /path/to/output
(Suponiendo que no tiene ningún uso para \r
s en su archivo. Suposición muy segura aquí.)
Alternativamente, simplemente ejecute dos2unix /path/to/input.list
una vez para convertir el archivo en el lugar.
Como muestra la respuesta vinculada de @ don_crissti, la opción de pegar limita increíblemente rápido:la tubería del kernel de Linux es más eficiente de lo que hubiera creído si no lo hubiera probado ahora. Sorprendentemente, si puede estar satisfecho con una sola coma que separa los elementos de su lista en lugar de una coma + espacio, una canalización de pegado
(paste -d\' /dev/null - /dev/null | paste -sd, -) <input
es más rápido incluso que un flex
razonable programa(!)
%option 8bit main fast
%%
.* { printf("'%s'",yytext); }
\n/(.|\n) { printf(", "); }
Pero si solo es aceptable un rendimiento decente (y si no está ejecutando una prueba de esfuerzo, no podrá medir ninguna diferencia de factor constante, todas son instantáneas) y desea flexibilidad con sus separadores y una razonable -liner-y-ness,
sed "s/.*/'&'/;H;1h;"'$!d;x;s/\n/, /g'
es tu billete. Sí, parece ruido de línea, pero el H;1h;$!d;x
idiom es la forma correcta de sorber todo, una vez que puedas reconocer que todo se vuelve realmente fácil de leer, es s/.*/'&'/
seguido de un sorbo y un s/\n/, /g
.
editar:bordeando lo absurdo, es bastante fácil obtener flexibilidad para vencer a todo lo demás hueco, solo dígale a stdio que no necesita la sincronización integrada de multihilo/controlador de señal:
%option 8bit main fast
%%
.+ { putchar_unlocked('\'');
fwrite_unlocked(yytext,yyleng,1,stdout);
putchar_unlocked('\''); }
\n/(.|\n) { fwrite_unlocked(", ",2,1,stdout); }
y bajo presión, eso es 2-3 veces más rápido que las canalizaciones de pegado, que son al menos 5 veces más rápidas que todo lo demás.