GNU/Linux >> Tutoriales Linux >  >> Linux

Convertir líneas separadas en una lista separada por comas con entradas entre comillas

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.

Nota

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.


Linux
  1. ¿Insertar nuevas líneas con valores faltantes (na)?

  2. ¿División de la salida en nuevas líneas?

  3. ¿Cómo puedo obtener Ls para listar directorios con una barra inclinada al final?

  4. Ve a por ello:una lista de tareas pendientes moderna con un temporizador

  5. Pegue dos listas de texto (una lista de un archivo) en una lista separada por punto y coma

Comando Netstat en Linux - 28 comandos con ejemplos

Creación de listas de palabras con Crunch en Kali Linux

Comando SS en Linux con ejemplos útiles

Cómo enumerar los sistemas de archivos en Linux con lfs

Divida una línea muy larga de palabras en líneas separadas de longitud máxima

¿Cómo enumero a todos los usuarios con root?