Tengo un archivo CSV que contiene los siguientes registros:
Name,Phone,Country
John,N/A,USA
Max,N/A,USA
Name,Color,Size
John,Blue,M
Max,Red,S
¿Cómo puedo leer solo los registros de Nombre, Color, Tamaño y más, usando bash?
Además, ¿cómo puedo limitar la salida hasta que alcance el EOF o una línea en blanco? Así que esto:
Name,Phone,Country
John,N/A,USA
Max,N/A,USA
Name,Color,Size
John,Blue,M
Max,Red,S
Dummy,Dummy,Dummy
Foo,Foo,Bar
No daría salida a esto:
John,Blue,M
Max,Red,S
Dummy,Dummy,Dummy
Foo,Foo,Bar
Pero más bien solo esto:
John,Blue,M
Max,Red,S
Ya probé grep y sed, pero sin suerte, también probé cola pero se desconoce el número de líneas hasta que se lee el archivo.
Respuestas:
Usando awk
Cómo funciona
El script awk tiene una variable,
f
que sirve como indicador para identificar cuándo estamos dentro de unName,Color,Size
bloque./^$/{f=0}
En una línea en blanco, configúrelo
f=0
para indicar que estamos fuera delName,Color,Size
bloque.f{print}
Cuando estemos en el bloque
f==1
, imprima la línea./Name,Color,Size/{f=1}
Cuando lleguemos al
Name,Color,Size
encabezado, configúrelof=1
para indicar que estamos en el bloque.Usando GNU sed
Cómo funciona
-n
Indique a sed que no imprima nada a menos que se lo solicitemos explícitamente.
/Name,Color,Size/{...}
Si la línea contiene el
Name,Color,Size
encabezado, ejecute los comandos entre llaves::a;
Esto define una etiqueta
a
.n;
Esto se lee en la siguiente línea.
/./{p; ba;}
Si la siguiente línea no está en blanco, imprímala (
p
) y bifurque (b
) nuevamente en la etiquetaa
.De esta manera, todas las líneas dentro del bloque se leerán e imprimirán y la impresión se detendrá con la primera línea vacía.
fuente
Puede usar sed para mostrar solo las cosas después de una determinada línea haciendo algo como
así que solo verás las líneas que vienen después
Name,Color,Size
fuente
0,
? Además, ¿cómo podría limitar la salida a la primera línea en blanco? En caso de que hubiera otras "tablas" en el mismo archivo?0
en el comando) hasta la línea que coincide con el patrón que queremos. Por lo tanto, eliminará todas esas líneas de la salida y, de forma predeterminada, imprimirá el resto.