2010-04-16 169 views
19

操作系統:OSX 方法:從命令行,所以使用sed,cut,gawk,但最好不要安裝模塊。解析csv文件的第一列到一個新文件

本質上,我試圖採取一個csv文件的第一列,並解析它到一個新的文件。

實施例輸入文件

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

慾望輸出

EXAMPLEfoo 
EXAMPLEbar 
EXAMPLE1 
EXAMPLE2 
EXAMPLE3 
EXAMPLE4 

因此,我希望的第一列。

這裏是我到目前爲止已經試過:

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 

無似乎工作,要麼他們只是打印的第一行或什麼都沒有,所以我會假設它的失敗由線到線讀取。

+0

正如我已經指出在回答你之前(和非常相似)的問題時,我的FOSS項目http://code.google.com/p/csvfix/正好可以做到這一點,它比awk等更容易用於解析CSV,並可用於OSX。 – 2010-04-16 11:35:02

+0

我加了'csv'標籤 – 2010-04-16 15:15:43

回答

24

你最後的選擇完美的作品對我來說:

$ 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 

也許行尾咬在這裏你?如果該文件具有DOS風格或甚至是舊式Mac風格的行尾,這可能會導致出現奇怪的行爲。嘗試運行file in.csv,看看它出現了什麼。

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

如果後者是您的情況,請使用dos2unix工具轉換文件。

編輯:在OS X上,它似乎flip is what you want

+0

你現在在線上的結局,現在修好了。 – S1syphus 2010-04-16 11:38:40

9

我複製粘貼您的樣品輸入,保存爲in.csv,然後跑到你的第一線,

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

和它的工作完美,像這樣:

$ 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 

這是在Terminal.app在OS X 10.5

+0

這很奇怪,awk最近一直給我提出問題。 – S1syphus 2010-04-16 11:34:08

2

對於我來說,切割產生預期的結果:

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

如果Perl是一個選項:

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

,將使用這些命令行選項:

  • -n環繞輸入文件的每行
  • -l處理之前去除換行符,然後將它們重新添加回
  • -a au tosplit模式 - 將輸入線分成@F陣列。默認分割爲空格。
  • -e執行Perl代碼
  • -F自動分割改性劑,在這種情況下上,

@F拆分是在每行的字的陣列,被索引開始$F[0]