2010-04-16 37 views
19

Hệ điều hành: OSX Phương pháp: Từ dòng lệnh, sử dụng sed, cut, gawk, mặc dù tốt nhất là không cài đặt mô-đun.Phân tích cú pháp cột đầu tiên của tệp csv thành tệp mới

Về bản chất tôi đang cố gắng lấy cột đầu tiên của tệp csv và phân tích cú pháp tệp đó thành tệp mới.

tập tin Ví dụ đầu vào

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

Desire đầu ra

EXAMPLEfoo 
EXAMPLEbar 
EXAMPLE1 
EXAMPLE2 
EXAMPLE3 
EXAMPLE4 

Vì vậy, tôi muốn cột đầu tiên.

Dưới đây là những gì tôi đã cố gắng cho đến nay:

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 

Không có vẻ làm việc, hoặc là họ chỉ in dòng đầu tiên hoặc không có gì cả, vì vậy tôi sẽ giả định nó không đọc từng dòng.

+0

Như tôi đã chỉ ra trả lời cho câu hỏi trước của bạn (và rất giống), dự án FOSS của tôi http://code.google.com/p/csvfix/ thực hiện chính xác điều này, dễ sử dụng hơn để phân tích cú pháp CSV hơn awk và cộng sự, và hoạt động trên OSX. –

+0

Tôi đã thêm thẻ 'csv' –

Trả lời

24

Tùy chọn cuối cùng của bạn hoạt động hoàn hảo cho tôi:

$ 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 

Có lẽ dòng kết thúc được cắn bạn ở đây? Nếu tệp có kiểu kết thúc kiểu DOS hoặc thậm chí kiểu dòng Mac cũ, điều này có thể gây ra hành vi lạ. Hãy thử chạy file in.csv và xem những gì nó đi kèm với.

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

Nếu trường hợp sau là tình huống của bạn, hãy sử dụng công cụ dos2unix để chuyển đổi tệp.

Chỉnh sửa: Trên OS X, có vẻ như flip is what you want.

+0

Bạn đã phát hiện ra về kết thúc dòng, đã sửa nó ngay bây giờ. – S1syphus

9

tôi copy-dán đầu vào mẫu của bạn, lưu nó như in.csv, và sau đó chạy dòng đầu tiên của bạn,

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

và nó làm việc một cách hoàn hảo, như vậy:

$ 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 

Đây là trong Terminal.app trên OS X 10.5

+0

Điều này thật kỳ quặc, gần đây đã khiến tôi gặp vấn đề. – S1syphus

2

Đối với tôi, cắt sẽ tạo ra kết quả mong đợi:

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

Nếu Perl là một lựa chọn:

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

Các tùy chọn dòng lệnh được sử dụng:

  • -n vòng quanh mỗi dòng của tập tin đầu vào
  • -l loại bỏ dòng mới trước khi chế biến và thêm lại chúng sau
  • -a au chế độ tosplit - chia các dòng đầu vào thành mảng @F. Mặc định là chia tách trên khoảng trắng.
  • -e thực thi mã perl
  • -F modifier autosplit, trong trường hợp này chia trên ,

@F là mảng của các từ trong mỗi dòng, lập chỉ mục bắt đầu với $F[0]

Các vấn đề liên quan