2010-12-15 10 views
7

Có đoạn ngắt ở cuối tệp .csv của tôi. Tôi đã cố gắng để loại bỏ các dòng trống đó là ở phần cuối của tập tin bằng cách sử dụng lệnh sau đây.Xóa dòng trống cuối cùng

sed -i '/^$/d' combined.csv 

Nhưng nó không hoạt động và dòng trống vẫn còn ở đó. Tôi có thể loại bỏ dòng cuối cùng bằng cách sử dụng lệnh sau.

sed -i '$d' combined.csv 

Nhưng có thể kiểm tra xem dòng cuối cùng có thực sự trống trước khi xóa không?

Cập nhật:

Tôi đang sử dụng lệnh sau để kiểm tra xem mỗi dòng bắt đầu với một số.

sed -i '1s/^[^0-9]*//' combined.csv 

Chỉ kiểm tra dòng đầu tiên chứ không phải phần còn lại của dòng. Làm cách nào để tôi kiểm tra tất cả các dòng trong tệp? Điều này có thể giải quyết vấn đề của tôi.

Trả lời

17

Hãy thử ${/^$/d;} tùy chọn này sẽ chỉ khớp với dòng trống nếu đó là dòng cuối cùng của tệp.

Cập nhật: cho câu hỏi thứ hai của bạn, chỉ cần loại bỏ các 1 trước khi s, tức là .: sed -i 's/^[^0-9]*//' combined.csv

+0

Cảm ơn, làm việc này! Bạn có thể xây dựng trên lệnh sed đầu tiên không? – dangonfast

5

Tìm thấy lứa tuổi này cách đây đâu đó và lưu đoạn. Đừng hỏi tôi làm thế nào nó hoạt động:

perl -i -pe "chomp if eof" combined.csv 
+2

Nếu không có dòng trống tại EOF (\ n \ n), điều này cũng sẽ loại bỏ \ n cuối cùng tại EOF - không được xóa trong Unix. –

+0

@AleksandrLevchuk: Điểm tốt, nhưng điều đó dễ dàng được sửa: 'perl -pe 'chomp nếu eof &&/^ $ /' combined.csv' – mklement0

0

Hãy thử $ {/^$/d;} này sẽ chỉ phù hợp với một dòng trống nếu nó là dòng cuối cùng của tập tin.

Tôi đã thử nó với sed (GNU sed) 4.2.2 và có dòng tất cả trống xóa không chỉ là dòng trống nếu nó là dòng cuối cùng của tập tin.

Tôi đã tìm thấy Lệnh sau đây, hoạt động cho bản thân tôi thực hiện Công việc.

sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' 

lệnh này là từ một Bộ sưu tập hữu ích SED-oneliners: http://sed.sourceforge.net/sed1line.txt

+0

' $ {/^$/d;} 'sẽ hoạt động tốt, với bất kỳ POSIX nào tương thích 'sed'.Hãy thử 'sed '$ {/^$/d;}' <<< $ 'một \ n \ nb \ n'' và bạn sẽ thấy chỉ có dòng cuối cùng bị loại bỏ. – mklement0

+0

Phương án thay thế của bạn thực hiện điều gì đó khác: nó cắt xén _all_ dòng mới, không chỉ là cuối cùng, và nó cũng đọc toàn bộ tập tin _at once_, điều không cần thiết trong trường hợp này và có vấn đề với các tệp lớn. – mklement0

0

Để loại bỏ các dòng trống, bạn có thể sử dụng grep . hoặc sed '/^$/d'

Nó sẽ loại bỏ bất kỳ dòng trống trong file. Tôi hy vọng bạn tập tin không có bất kỳ dòng trống ở giữa nhưng điều này sẽ làm việc trong trường hợp của bạn.

cat combined.csv | grep .

hoặc

cat combined.csv | sed '/^$/d'