En un archivo de texto, quiero eliminar ,
(comas) y también las "
(comillas) (solo si las comillas dobles contienen números separados por comas).
56,72,"12,34,54",x,y,"foo,a,b,bar"
Salida esperada
56,72,123454,x,y,"foo,a,b,bar"
Nota: muestro la línea anterior solo como un ejemplo. Mi archivo de texto contiene muchas líneas como las anteriores y los números separados por comas presentes dentro de las comillas dobles deben variar. Es decir,
56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"
Rendimiento esperado:
56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"
Hay una n
cantidad de números presentes dentro de las comillas dobles separadas por comas. Y también deje las comillas dobles que contienen caracteres tal como están.
Me encanta la sed
herramienta de procesamiento de texto. Estoy feliz si publicas alguna sed
solución para esto.
text-processing
sed
csv
Avinash Raj
fuente
fuente
56,72,"12,34,54",x,y,"foo,a,b,bar"
a56,72,123454,x,y,"a,b"
,foo
ybar
es desaparecer. ¿Es tu salida deseada?foo
ybar
) se eliminan junto con las comas. Además, algunas de las citas desaparecen donde quedan otras. Sin mencionar que las comas entrea
yb
permanecen también. ¿Hay algún patrón para estos?Respuestas:
Esto (adaptado de aquí ) debería hacer lo que necesita, aunque el Perl de @ rici es mucho más simple:
Explicación
:a
: define una etiqueta llamadaa
.s/(("[0-9,]*",?)*"[0-9,]*),/\1/
: Este necesita ser desglosado(foo(bar))
,\1
seráfoobar
y\2
serábar
."[0-9,]*",?
: coincide con 0 o más de0-9
o,
, seguido de 0 o 1,
.("[0-9,]*",?)*
: coincide con 0 o más de los anteriores."[0-9,]*
: coincide con 0 o más0-9
o,
que vienen justo después de un"
ta;
: vuelva a la etiquetaa
y vuelva a ejecutar si la sustitución se realizó correctamente.s/""/","/g;
: Postprocesamiento. Reemplazar""
con","
.s/"([0-9]*)",?/\1,/g
: elimina todas las comillas alrededor de los números.Esto podría ser más fácil de entender con otro ejemplo:
Entonces, si bien puede encontrar un número justo después de una cita y seguido de una coma y otro número, una los dos números y repita el proceso hasta que ya no sea posible.
En este punto, creo que es útil mencionar una cita
info sed
que aparece en la sección que describe funciones avanzadas como la etiqueta utilizada anteriormente (gracias por encontrar si @Braiam):fuente
Si perl está bien, aquí hay una forma corta (y probablemente rápida, si no necesariamente simple :)) de hacerlo:
El
e
indicador dels:::
operador (que es solo otra forma de escrituras///
) hace que el reemplazo se trate como una expresión que se evalúa cada vez. Esa expresión toma la$1
captura de la expresión regular (que ya falta las comillas) y la traduce (y///
que también se puede escribir comotr///
) eliminando (/d
) todas las comas. Elr
indicador ay
es necesario para obtener el valor de ser la cadena traducida, en lugar del recuento de traducciones.Para aquellos que de alguna manera se sienten manchados por Perl, aquí está el equivalente a Python. Python realmente no es una herramienta de línea única de shell, pero a veces se puede engatusar para que coopere. Lo siguiente se puede escribir como una línea (a diferencia de los
for
bucles, que no pueden ser), pero el desplazamiento horizontal lo hace (aún más) ilegible:fuente
y///
lugar detr///
salvarnos un personaje más.Para los datos CSV, usaría un lenguaje con un analizador CSV real. Por ejemplo con Ruby:
fuente
Hola, aquí está el código de Python para reemplazar comas con comillas dobles, las comas se reemplazan con un carácter de barra vertical (|)
Este código de Python es para reemplazar comas entre comillas dobles
por ejemplo: x, y, z, 1,2, "r, e, t, y", h, 8,5,6
si se reemplaza con Pipe x, y, z, 1,2, "r | e | t | y", h, 8,5,6
si se reemplaza con nulo x, y, z, 1,2, "rety", h, 8,5,6
fuente