2012-11-15 41 views
16

Tôi có một tệp csv lớn (theo thứ tự terabyte).chèn một dòng vào tệp csv

Bây giờ, tôi muốn chèn một hàng là tiêu đề lên trên cùng.

Ví dụ nếu input.csv trông như thế này:

1,2,3,4 
22,3,23,1 

Tôi muốn nó trông giống như

id1,id2,id3,id4 
1,2,3,4 
and so on 

Làm thế nào để tôi làm điều này từ vỏ, thiết bị đầu cuối, awk, bash/

?

Trả lời

16

Ở vị trí, sử dụng sed:

sed -i 1i"id1,id2,id3,id4" file.csv 

chỉnh sửa:

Như @Ed Morton chỉ ra, bằng cách sử dụng sed với -i switch sed chỉnh sửa các tập tin tại chỗ, và do đó có thể nguy hiểm khi chỉnh sửa các tập tin lớn. Nếu bạn cung cấp tiền tố sau tùy chọn -i thì sed tạo bản sao lưu. Vì vậy, một cái gì đó như thế này sẽ an toàn hơn:

sed -i.bak 1i"id1,id2,id3,id4" file.csv 

Các tập tin gốc sau đó sẽ được đặt tại file.csv.bak

+0

Tôi chắc chắn sẽ không làm điều đó với một tập tin lớn như vậy. sed đang tạo ra một tập tin tmp trên bay - nếu nó không tìm thấy không gian cho nó tôi sẽ không ngạc nhiên nếu bạn bị mất các nội dung của tập tin ban đầu của bạn. Chỉ cần sử dụng tập tin 'cmd> tmp && mv tmp' và bạn biết bạn an toàn. –

+0

@Ed: bạn nói đúng, điều này không đặc biệt an toàn đối với các tệp rất lớn như tệp đang được đề cập đến. Tôi đã chỉnh sửa câu trả lời của mình để cung cấp giải pháp thay thế an toàn hơn, vẫn sử dụng sed. –

9

Điều này đơn giản như:

{ echo "id1,id2,id3,id4"; cat file.csv; } > newfile.csv 

sử dụng ghép nối đơn giản.

EDIT

sau khi chủ đề thảo luận dưới đây, tôi đề nghị này:

  • tạo ra một tập tin với tiêu đề của bạn, nói head.txt

Sau đó:

cat head.txt file.csv > newfile.csv 
+0

Có cách nào không "echo" toàn bộ nội dung của tệp .. vì một lý do nào đó nó đang pritining tất cả nội dung của tệp .. và tệp thực sự khổng lồ của nó? – Fraz

+0

@Fraz: không có cách nào dễ dàng để thực hiện việc này, ngay cả khi thực hiện nó mà không có tệp tạm thời (như trong câu trả lời của tôi). Vấn đề là bạn phải chuyển tất cả dữ liệu trong tệp xuống 16 byte. –

+0

oh .. ok .. tôi nhận được một lỗi mà lệnh không tìm thấy .. một truy vấn dài của nó .. do đó, đây là {echo "mkey1, merchant_id, flag, default, E1, E2, E3, E4, E5, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, E28, E29, E30, E31, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, I1, I2, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, ​​I17, I18, I19, I20, I21, I22, I23, I24, I25, I26, I27, I28, I29, I30, I31, I32, I33, I34, I35, I36, I37, I38, I39, I40, I41, I42, I43, I44, I46, I47, I48, I50, I51, I52, I53, I54, I55, I56, O1, O2, O3, O4, O5, O6, O7, O8, O9, benchmark_score, julian, cân nặng " ; cat prepar_input.csv; }> mahout_input.csv – Fraz

1

Không có cách nào dễ dàng, bạn sẽ phải viết lại tập tin. Có lẽ là cách an toàn nhất là

(echo "id1,id2,id3,id4" ; cat file) > newFile && rm file 

IHTH

+2

Tại sao lại sử dụng một vỏ bọc phụ ở đây? –

+0

kinh nghiệm của tôi là {....} có hiệu quả là một subshell. Vì vậy, nó là 1/2 của 1, 0,5 của người khác. Chúc may mắn. – shellter

+2

Không, '()' là một subshell trong khi '{}' là một nhóm. –

2

Chỉnh sửa. Khi tôi viết câu trả lời này, tôi đã bỏ qua phần "terabyte" của câu hỏi. Do đó, không sử dụng phương pháp được trình bày ở đây. Tôi vẫn để lại bài đăng này, vì nó quảng cáo việc sử dụng công cụ tuyệt vời này, ed, trình soạn thảo văn bản chuẩn.

Như thường lệ, ed là trình soạn thảo văn bản chuẩn. Các giải pháp sử dụng sed -i không, như nó đề cập đến, "chỉnh sửa các tập tin tại chỗ". Thay vào đó, nó sẽ xuất nội dung của nó thành một tệp tạm thời và sau đó đổi tên tệp này thành tệp gốc. Điều đó thực sự không tốt cho các tệp lớn!

Sử dụng ed thay vì thực sự chỉnh sửa tệp.Một cái gì đó dọc theo dòng sau đây:

#!/bin/bash 

file="input.csv" 

{ 
ed -s "$file" <<EOF 
1 
i 
id1,id2,id3,id4 
. 
wq 
EOF 
} > /dev/null 

Giải thích: 1 đi vào dòng đầu tiên, i chuyển sang chế độ chèn, sau đó chúng tôi chèn id1,id2,id3,id4 sau đó . để quay trở lại chế độ bình thường, và wq để viết và bỏ thuốc lá.

Với phương pháp này, bạn thực sự chỉnh sửa tệp và nhanh gấp hai lần so với phương pháp sed. Ngoài ra, ed được biết đến là "tệp an toàn lớn"!

Xong.

+0

Không đúng là không có bộ đệm nào được tạo. 'ed' sẽ đọc toàn bộ tệp vào bộ đệm và zap tệp gốc trước khi ghi bộ đệm của nó vào tệp đó. Nó sẽ rất chậm và không an toàn. –

+0

Vâng, đó là những gì chỉnh sửa một tập tin có nghĩa là :) –

+0

Nếu bạn biết rằng sau đó bạn không nên đánh lừa OP bằng cách nói "Không có tập tin tạm thời tạo ra, ** không có bộ đệm **, không có gì!". –

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