2010-04-16 13 views
19

Sistema operativo: OSX Método: Desde la línea de comandos, así que use sed, cut, gawk, aunque preferiblemente no instale módulos.Analizando la primera columna de un archivo csv en un nuevo archivo

Básicamente, estoy tratando de tomar la primera columna de un archivo csv y analizarlo en un nuevo archivo.

archivo Ejemplo de entrada

EXAMPLEfoo,60,6 
EXAMPLEbar,30,6 
EXAMPLE1,60,3 
EXAMPLE2,120,6 
EXAMPLE3,60,6 
EXAMPLE4,30,6 

salida deseo

EXAMPLEfoo 
EXAMPLEbar 
EXAMPLE1 
EXAMPLE2 
EXAMPLE3 
EXAMPLE4 

así que quiero la primera columna.

Aquí es lo que he probado hasta ahora:

awk -F"," '{print $1}' in.csv > out.txt 

awk -F"," '{for (i=2;i<=NF;i++)}' in.csv > out.txt 

awk -F"," 'BEGIN { OFS="," }' '{print $1}' in.csv > out.txt 

cat in.csv | cut -d \, -f 1 > out.txt 

Nada parece funcionar, ya sea que acaba de imprimir la primera línea, o nada en absoluto, así que supongo que está fallando para leer línea por línea.

+0

Como he señalado en respuesta a su pregunta anterior (y muy similar), mi proyecto de FOSS http://code.google.com/p/csvfix/ hace exactamente esto, es más fácil de usar para analizar CSV que awk et al, y funciona en OSX. –

+0

Agregué la etiqueta 'csv' –

Respuesta

24

Su última opción funciona perfectamente para mí:

$ cat > in.csv # Then pasted the example input followed by Ctrl+D: 
EXAMPLEfoo,60,6 
EXAMPLEbar,30,6 
EXAMPLE1,60,3 
EXAMPLE2,120,6 
EXAMPLE3,60,6 
EXAMPLE4,30,6 
[Ctrl+D] 
$ cat in.csv | cut -d, -f1 
EXAMPLEfoo 
EXAMPLEbar 
EXAMPLE1 
EXAMPLE2 
EXAMPLE3 
EXAMPLE4 

Tal vez los finales de línea se le muerde aquí? Si el archivo tiene terminaciones de línea estilo DOS o incluso estilo Mac antiguo, esto podría causar un comportamiento extraño. Intenta ejecutar file in.csv y mira de qué se trata.

$ file in.unix.csv 
in.unix.csv: ASCII text 
$ file in.dos.csv 
in.dos.csv: ASCII text, with CRLF line terminators 

Si éste es su caso, utilice la herramienta dos2unix para convertir el archivo.

Editar: En OS X, parece flip is what you want.

+0

Estabas al tanto de las terminaciones de línea, lo arregló ahora. – S1syphus

9

copio-pegado a su entrada de la muestra, guardado como in.csv, y luego corrió su primera línea,

awk -F"," '{print $1}' in.csv > out.txt 

y funcionó a la perfección, así:

$ emacs in.csv 
$ cat in.csv 
EXAMPLEfoo,60,6 
EXAMPLEbar,30,6 
EXAMPLE1,60,3 
EXAMPLE2,120,6 
EXAMPLE3,60,6 
EXAMPLE4,30,6 
$ awk -F"," '{print $1}' in.csv > out.txt 
$ cat out.txt 
EXAMPLEfoo 
EXAMPLEbar 
EXAMPLE1 
EXAMPLE2 
EXAMPLE3 

Este es en Terminal.app en OS X 10.5

+0

Esto es extraño, awk me ha estado dando problemas recientemente. – S1syphus

2

Para mí, corte produce resultado esperado:

cut -d, -f1 <in.csv> out.txt 
0

Si Perl es una opción:

perl -F, -lane 'print $F[0]' in.csv > out.txt

se utilizan estas opciones de línea de comandos:

  • -n bucle alrededor de cada línea del archivo de entrada
  • -l elimina los saltos de línea antes de su procesamiento , y los agrega de nuevo en adelante
  • -a au modo tosplit: divide las líneas de entrada en la matriz @F. El valor predeterminado es la división en espacios en blanco.
  • -e ejecutar el código Perl
  • -F modificador autosplit, en este caso se divide en ,

@F es la matriz de palabras en cada línea, indexados comenzando con $F[0]