Có một chính tả dòng lệnh để thả một cột trong tệp CSV không?


32

Có một tệp các nội dung sau:

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd

Tôi tìm cách lấy một tệp bằng với bản gốc nhưng thiếu một cột thứ n như, với n = 2 (hoặc có thể là 3)

1111,2222,4444
aaaa,bbbb,dddd

hoặc, với n = 0 (hoặc có thể là 1)

2222,3333,4444
bbbb,cccc,dddd

Một tập tin thực sự có thể dài hàng gigabyte với hàng chục nghìn cột.

Như mọi khi, như vậy, tôi nghi ngờ các pháp sư dòng lệnh có thể đưa ra một giải pháp tao nhã ... :-)

Trong trường hợp thực tế của tôi, tôi cần bỏ 2 cột đầu tiên, có thể được thực hiện bằng cách thả một cột đầu tiên hai lần trong một chuỗi, nhưng tôi cho rằng việc khái quát hóa một chút sẽ thú vị hơn.


Các lĩnh vực được đảm bảo không chứa ,? (Tức ,là , chỉ được sử dụng như một dấu tách trường.)
CVn

@ MichaelKjorling, thật tuyệt khi có một giải pháp linh hoạt hơn, nhưng trong trường hợp của tôi - có: dải phân cách ,và nó không bao giờ xảy ra trong một trường.
Ivan

Trong trường hợp đó, câu trả lời của Scott chỉ là vấn đề.
một CVn

Câu trả lời:


47

Tôi tin rằng điều này là cụ thể để cắt từ lõi GNU:

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd

Thông thường, bạn chỉ định các trường bạn muốn thông qua -f, nhưng bằng cách thêm - bù đắp, bạn sẽ đảo ngược ý nghĩa một cách tự nhiên. Từ 'người đàn ông cắt':

--complement
    complement the set of selected bytes, characters or fields

Một cảnh báo: nếu bất kỳ cột nào chứa dấu phẩy, nó sẽ bị cắt, bởi vì phần cắt không phải là trình phân tích cú pháp CSV giống như bảng tính. Nhiều trình phân tích cú pháp có các ý tưởng khác nhau về cách xử lý dấu phẩy thoát trong CSV. Đối với trường hợp CSV đơn giản, trên dòng lệnh, cắt vẫn là cách để đi.


4
Nó hoạt động tốt miễn là nó là một tệp CSV đơn giản. Nếu bất kỳ cột nào là một chuỗi có dấu phẩy trong đó, nó sẽ cutbị loại bỏ vì đó không phải là trình phân tích cú pháp CSV. Nếu một trường CSV có dấu tách trường trong giá trị của nó, thì nó được gói trong dấu ngoặc kép. Btw, về chủ đề cut, -fcó phạm vi trường. cut -f, -d3-sẽ xuất trường thứ ba trên, loại bỏ hai trường đầu tiên.
Alexios

2
Ý bạn làcut -d, -f3-
Vô dụng

@Alexios đó là một điểm tốt. Tôi không bao giờ thực sự đối phó với CSV "thực", chỉ có tập hợp con đơn giản. Tôi sẽ chỉnh sửa câu trả lời của tôi để phản ánh điều đó.
Scott McClung

@ Vô dụng: Chết tiệt, đúng vậy. Đó là những gì tôi gọi là 'chứng khó đọc' của tôi một lần nữa. thở dài . Scott: Tệp CSV là những con thú khôn lanh. Quá nhiều định dạng phụ khác nhau, một số trong đó thậm chí không phải là C SV, nhưng dù sao cũng được gọi là định dạng đó.
Alexios

Điều này in CSV mới đến thiết bị đầu cuối của tôi - làm cách nào để ghi đè lên đầu vào (hoặc có thể ghi vào một tệp mới, có vẻ như OP đang tìm kiếm)?
Max Ghenis

12

Nếu dữ liệu được tạo đơn giản bằng các cột được phân tách bằng dấu phẩy:

cut -d , -f 1-2,4-

Bạn cũng có thể sử dụng awk, nhưng điều này hơi khó xử vì trong khi xóa một trường rất dễ dàng, việc xóa dấu phân tách sẽ mất một số công việc. Nếu bạn không có trường trống, nó không quá tệ:

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'

Nếu bạn có CSV thực tế, nơi dấu phẩy có thể xuất hiện bên trong các trường nếu được trích dẫn chính xác, bạn cần một thư viện CSV thực sự .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.