Si tengo un archivo csv, ¿existe una forma rápida de bash para imprimir el contenido de una sola columna? Es seguro asumir que cada fila tiene el mismo número de columnas, pero el contenido de cada columna tendría una longitud diferente.
111
echo '1,"2,3,4,5",6' | awk -F "\"*,\"*" '{print $2}'
imprimirá en2
lugar de2,3,4,5
.gawk -F"|" "{print $13}" files*.csv
...,"string,string",...
"
y la última terminará con"
awk -F "\"*;\"*" '{print $2}' textfile.csv
si.
cat mycsv.csv | cut -d ',' -f3
imprimirá la tercera columna.fuente
awk
La forma más sencilla en la que pude hacer esto fue usar csvtool . También tuve otros casos de uso para usar csvtool y puede manejar las comillas o delimitadores de manera adecuada si aparecen dentro de los datos de la columna.
Reemplazar 2 con el número de columna extraerá efectivamente los datos de columna que está buscando.
fuente
cat input.csv | csvtool formath '%(2)\n' -
Nota Sé que cat here es inútil, pero sustitúyalo por cualquier comando que normalmente exportaría un csv.format '%(2)\n'
comando no podría decir dónde termina un campo. (csvtool 1.4.2)csvtool
parecen requerir el uso-
como nombre de archivo de entrada para leer desde stdin.csvtool format '%(1),%(10)\n' - < in.csv > out.csv
Aterrizado aquí buscando extraer de un archivo separado por pestañas. Pensé que agregaría.
Donde
-f2
extrae la columna indexada 2, distinta de cero, o la segunda columna.fuente
cat
es innecesario:< textfile.tsv cut -f2 -s
Muchas respuestas para estas preguntas son excelentes y algunas incluso han examinado los casos de esquina. Me gustaría agregar una respuesta simple que puede ser de uso diario ... donde la mayoría de las veces se mete en esos casos de esquina (como haber salido comas o comas entre comillas, etc.).
Entonces, usando BEGIN (Ejecutar antes de tomar la entrada) podemos establecer este campo en lo que queramos ...
El código anterior imprimirá la tercera columna en un archivo csv.
fuente
Las otras respuestas funcionan bien, pero como solicitó una solución usando solo el shell bash, puede hacer esto:
Y luego puede extraer columnas (la primera en este ejemplo) así:
Entonces, hay un par de cosas que suceden aquí:
while IFS=,
- esto significa usar una coma como IFS (Internal Field Separator), que es lo que usa el shell para saber qué separa los campos (bloques de texto). Entonces, decir IFS =, es como decir "a, b" es lo mismo que "a b" sería si el IFS = "" (que es lo que es por defecto).read -a csv_line;
- esto es decir leer en cada línea, una a la vez y crear una matriz donde cada elemento se llame "csv_line" y enviarlo a la sección "do" de nuestro bucle whiledo echo "${csv_line[0]}";done < file
- ahora estamos en la fase "do", y estamos diciendo que hagamos eco del elemento 0 de la matriz "csv_line". Esta acción se repite en cada línea del archivo. La< file
parte solo le dice al bucle while de dónde leer. NOTA: recuerde, en bash, las matrices están indexadas en 0, por lo que la primera columna es el elemento 0.Ahí lo tienes, sacando una columna de un CSV en el shell. Las otras soluciones son probablemente más prácticas, pero esta es bash puro.
fuente
Puede utilizar GNU Awk, consulte este artículo de la guía del usuario . Como una mejora a la solución presentada en el artículo (en junio de 2015), el siguiente comando gawk permite comillas dobles dentro de campos entre comillas dobles; una comilla doble está marcada por dos comillas dobles consecutivas ("") allí. Además, esto permite campos vacíos, pero incluso esto no puede manejar campos multilínea . El siguiente ejemplo imprime la tercera columna (vía
c=3
) de textfile.csv:Tenga en cuenta el uso de
dos2unix
para convertir posibles saltos de línea de estilo DOS (CRLF, es decir, "\ r \ n") y codificación UTF-16 (con marca de orden de bytes) a "\ n" y UTF-8 (sin marca de orden de bytes), respectivamente. Los archivos CSV estándar usan CRLF como salto de línea, consulte Wikipedia .Si la entrada puede contener campos de varias líneas, puede utilizar el siguiente script. Tenga en cuenta el uso de una cadena especial para separar registros en la salida (ya que la nueva línea del separador predeterminado podría ocurrir dentro de un registro). Nuevamente, el siguiente ejemplo imprime la tercera columna (vía
c=3
) de textfile.csv:Hay otro enfoque del problema. csvquote puede generar contenido de un archivo CSV modificado para que los caracteres especiales dentro del campo se transformen para que las herramientas habituales de procesamiento de texto de Unix se puedan utilizar para seleccionar cierta columna. Por ejemplo, el siguiente código genera la tercera columna:
csvquote
se puede utilizar para procesar archivos grandes arbitrarios.fuente
Aquí hay un ejemplo de archivo csv con 2 columnas
Para obtener la primera columna, use:
f significa campo y d significa delimitador
Ejecutar el comando anterior producirá el siguiente resultado.
Salida
Para obtener solo la segunda columna:
Y aquí está la salida Salida
Otro caso de uso:
Su archivo de entrada csv contiene 10 columnas y desea las columnas 2 a 5 y las columnas 8, usando una coma como separador ".
cut usa -f (que significa "campos") para especificar columnas y -d (que significa "delimitador") para especificar el separador. Debe especificar este último porque algunos archivos pueden usar espacios, tabulaciones o dos puntos para separar columnas.
cut es una utilidad de comando y aquí hay algunos ejemplos más:
fuente
Necesitaba un análisis CSV adecuado, no
cut
/awk
y oración. Estoy probando esto en una Mac sincsvtool
, pero las Mac vienen con ruby, así que puedes hacer:fuente
Primero crearemos un CSV básico
Entonces obtenemos la primera columna
fuente
donde 2 es la columna que le interesa
tu tambien puedes hacer
hacer varias columnas
fuente
Creo que lo más fácil es usar csvkit :
Obtiene la segunda columna:
csvcut -c 2 file.csv
Sin embargo, también existe csvtool , y probablemente una serie de otras herramientas bash csv por ahí:
sudo apt-get install csvtool
(para sistemas basados en Debian)Esto devolvería una columna con la primera fila con 'ID' en ella.
csvtool namedcol ID csv_file.csv
Esto devolvería la cuarta fila:
csvtool col 4 csv_file.csv
Si desea eliminar la fila del encabezado:
csvtool col 4 csv_file.csv | sed '1d'
fuente
Me pregunto por qué ninguna de las respuestas hasta ahora ha mencionado csvkit.
documentación csvkit
Lo uso exclusivamente para la gestión de datos csv y hasta ahora no he encontrado ningún problema que no haya podido resolver usando cvskit.
Para extraer una o más columnas de un archivo cvs, puede utilizar la
csvcut
utilidad que forma parte de la caja de herramientas. Para extraer la segunda columna use este comando:página de referencia de csvcut
Si las cadenas en el csv están entre comillas, agregue el carácter de comillas con la
q
opción:Instalar con
pip install csvkit
osudo apt install csvkit
.fuente
No puede hacerlo sin un analizador CSV completo.
fuente
cut
Cuenta?He estado usando este código por un tiempo, no es "rápido" a menos que cuente "cortar y pegar desde stackoverflow".
Utiliza operadores $ {##} y $ {%%} en un bucle en lugar de IFS. Llama 'err' y 'die', y solo admite comas, guiones y tuberías como caracteres SEP (eso es todo lo que necesitaba).
Ejemplo:
fuente
También puede usar while loop
fuente