2010-04-16 32 views
19

Sistema operativo: OSX Metodo: dalla riga di comando, quindi utilizzando sed, cut, gawk, sebbene preferibilmente senza moduli di installazione.Analizzare la prima colonna di un file csv in un nuovo file

In sostanza sto provando a prendere la prima colonna di un file csv e analizzarla in un nuovo file.

file di input Esempio

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

uscita Desiderio

EXAMPLEfoo 
EXAMPLEbar 
EXAMPLE1 
EXAMPLE2 
EXAMPLE3 
EXAMPLE4 

Quindi voglio la prima colonna.

Ecco quello che ho provato finora:

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 

Nessuno sembra funzionare, o semplicemente stampare la prima linea o niente del tutto, quindi vorrei assumere è non riuscire a leggere riga per riga.

+0

Come ho sottolineato in risposta alla tua precedente (e molto simile) domanda, il mio progetto FOSS http://code.google.com/p/csvfix/ fa esattamente questo, è più facile da usare per analizzare CSV che da awk et al, e funziona su OSX. –

+0

Ho aggiunto il tag 'csv' –

risposta

24

La tua ultima opzione funziona perfettamente per me:

$ 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 

Forse linea terminazioni sono mordere voi qui? Se il file ha terminazioni di linea in stile DOS o anche in stile Mac vecchio, ciò potrebbe causare strani comportamenti. Prova a eseguire file in.csv e guarda cosa succede.

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

Se quest'ultimo è la vostra situazione, utilizzare lo strumento dos2unix per convertire il file.

Modifica: su OS X, sembra flip is what you want.

+0

Sei stato azzeccato riguardo alle terminazioni di linea, l'hai risolto ora. – S1syphus

9

copio-incollato l'input del campione, salvati come in.csv, e poi corse la prima linea,

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

e ha funzionato perfettamente, in questo modo:

$ 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 

Questo è in Terminal.app su OS X 10.5

+0

Questo è strano, awk mi ha dato problemi di recente. – S1syphus

2

Per me, taglio produce risultato atteso:

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

Se Perl è un'opzione:

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

sono utilizzati Queste opzioni della riga di comando:

  • -n cappio intorno ad ogni riga del file di input
  • -l rimuove ritorni a capo prima della lavorazione , e li aggiunge di nuovo in seguito
  • -a au modalità tosplit: divide le linee di input nell'array @F. Predefinito per la divisione su spazi vuoti.
  • -e eseguire il codice Perl
  • -F autosplit modificatore, in questo caso si divide in ,

@F è la matrice di parole ciascuna linea, indicizzati a partire da $F[0]

Problemi correlati