2010-04-16 13 views
19

System operacyjny: OSX Metoda: Z wiersza poleceń, więc używając sed, cut, gawk, chociaż najlepiej nie instaluje modułów.Parsowanie pierwszej kolumny pliku CSV do nowego pliku

Zasadniczo próbuję pobrać pierwszą kolumnę pliku csv i przeanalizować go do nowego pliku.

Przykład pliku wejściowego

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

wyjście Pragnienie

EXAMPLEfoo 
EXAMPLEbar 
EXAMPLE1 
EXAMPLE2 
EXAMPLE3 
EXAMPLE4 

Więc chcę pierwszej kolumnie.

Oto, co starałem dotąd:

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 

Żaden wydają się działać, albo po prostu wydrukować pierwszą linię lub w ogóle nic, więc zakładam, że jest to w przypadku braku czytać wiersz po wierszu.

+0

Jak już wskazał w odpowiedzi na twoje poprzednie (i bardzo podobne) pytanie, mój projekt FOSS http://code.google.com/p/csvfix/ robi dokładnie to, jest łatwiejszy w użyciu do analizy CSV niż awk i wsp. i działa na OSX. –

+0

Dodałem tag "csv" –

Odpowiedz

24

Twoja ostatnia opcja działa idealnie dla mnie:

$ 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 

Może linia zakończeń są gryzie cię tutaj? Jeśli plik ma końcówki linii w stylu DOS lub nawet stare, może to powodować dziwne zachowanie. Spróbuj uruchomić file in.csv i zobaczyć, co się da.

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

Jeśli to drugie to sytuacja, użyj narzędzia dos2unix przekonwertować plik.

Edytuj: W systemie OS X wygląda na to, że flip is what you want.

+0

Byłeś na miejscu o liniach końcowych, naprawiłeś to teraz. – S1syphus

9

kopiować, wklejać swoje wejście próbki, zapisane jako in.csv, a następnie prowadził swój pierwszy wiersz,

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

i to działało idealnie, tak jak poniżej:

$ 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 

Jest w Terminal.app na OS X 10.5

+0

To dziwne, awk ostatnio udzielał mi problemów. – S1syphus

2

Dla mnie cięcie daje oczekiwany wynik:

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

Jeśli Perl jest opcja:

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

Te opcje wiersza polecenia są używane:

  • -n pętla wokół każdej linii pliku wejściowego
  • -l usuwa znaki nowej linii przed obróbką i dodaje je później
  • -a au tryb tosplit - podziel linie wejściowe na tablicę @F. Domyślnie dzielenie na białe znaki.
  • -e wykonać kod Perl
  • -F AutoSplit modyfikator, w tym przypadku dzieli się na ,

@F jest tablica słów w każdym wierszu, indeksowania zaczynając $F[0]

Powiązane problemy