2010-06-10 34 views
13

Tôi có một bó toàn bộ tập tin trong một thư mục và từ mọi tập tin tôi muốn loại bỏ dòng đầu tiên (bao gồm cả vận chuyển trở lại). Tôi có thể đọc toàn bộ tập tin vào một chuỗi các chuỗi và viết tất cả, nhưng phần tử đầu tiên vào một tập tin mới, nhưng có vẻ hơi cồng kềnh với tôi là có cách nào tốt hơn? Oh ngôn ngữ ưa thích là Perl.Perl: Làm thế nào để loại bỏ dòng đầu tiên của một tập tin mà không đọc và sao chép toàn bộ tập tin

+10

Điều này là không thể vì cách lưu trữ tệp. Bạn sẽ luôn luôn phải đọc toàn bộ tập tin, và viết tất cả mọi thứ nhưng dòng đầu tiên - hệ điều hành không có cách nào khác. – Konerak

Trả lời

23

Hãy thử điều này một liner

perl -pi -e '$_ = "" if ($. == 1);' filename 

Tôi đã sử dụng nó trước, nên tất cả các bạn cần.

+0

+1 Không bao giờ cần lưu trữ nhiều hơn một dòng tại một thời điểm. – mob

+0

bạn có thể giải thích cách hoạt động của nó không? – FistOfFury

+0

về cơ bản nó nói chạy perl, phân tích tại chỗ và thực thi dòng mã sau đây. Dòng sau sử dụng biến mặc định $ _ trong trường hợp này là dòng được đọc bởi tùy chọn -p. $. là số dòng của tên tệp. vì vậy nếu số dòng là == 1 thì đặt văn bản của dòng thành "". –

5
use Tie::File qw(); 
for my $filename (glob 'some_where/some_files*') { 
    tie my @file, 'Tie::File', $filename or die "Could not open $filename: $!"; 
    shift @file; 
} 
+0

+1 nếu chỉ cho PS của bạn. :) –

+1

Lưu ý rằng điều này vẫn phải đọc và sao chép toàn bộ tập tin, nhưng đó là vốn có trong vấn đề. Tôi không biết bất kỳ hệ điều hành nào cung cấp bất kỳ cách nào khác để xóa dữ liệu khỏi đầu tệp. – cjm

+0

Tie :: Tệp là lựa chọn hiển nhiên của tôi vì nó được viết rõ ràng để giải quyết vấn đề này một cách hiệu quả. – daxim

9
perl -n -i -e 'print unless $. == 1' myfile 

Điều này tương tự câu trả lời của stocherilac.

Nhưng, trong mọi trường hợp (và trong tất cả các câu trả lời khác được đưa ra!), Bạn luôn đọc toàn bộ tệp. Không có cách nào để tránh điều đó, AFAIK.

+0

+1 cho nhiều cách để làm điều đó :) –

+0

+1 cho phiên bản có thể đọc được (IMHO) dễ đọc hơn. –

+0

Trong Windows dưới giao diện điều khiển MinGW mà một trong những xóa tập tin của tôi "Không thể làm tại chỗ chỉnh sửa trên myfile: Quyền bị từ chối" – user869097

11

Làm thế nào về

tail +2 

trong vỏ?

(chỉnh sửa: trong Linux mới hơn, bạn có thể cần tail -n +2 (cảm ơn bạn, GNU :()!)

9

Oh ngôn ngữ ưa thích là Perl

Đôi khi sed là một sed tốt hơn. thậm chí perl:

sed -i 1d * 
-1

Như được chỉ ra bởi Schwern, sau đây không thực hiện một lối ra sớm càng Ban đầu tôi đã nghĩ rằng nó sẽ:

perl -pi -e '$_ = q// and last if $. == 1;' myFile 

Có vẻ như một không thể tránh xử lý toàn bộ tập tin sau khi tất cả.

+4

Điều này không làm những gì bạn nghĩ rằng nó. Nếu nó đã làm, nó sẽ vi phạm như thế nào các tập tin làm việc trên Unix. Điều thực sự xảy ra là '$ _ =" "' luôn luôn sai nên '$ _ =" "và last' giống với' 0 và last'.Nó ngắn mạch và không bao giờ gọi 'cuối cùng'. Bạn đã viết: 'perl -pi e '$ _ = q // nếu $. == 1 'myFile' là một cách thông minh để không in dòng đầu tiên, nhưng chắc chắn nhất là đọc toàn bộ tệp. Chạy với '-MO = Deparse' để lấy mã và chạy nó trong trình gỡ rối để xem. 'do {this; cái đó; } nếu something' là một cấu trúc an toàn hơn. – Schwern

+0

@Schwern: Tệ của tôi. Phải mất một thời gian cho lời giải thích của bạn để chìm vào, nhưng tôi thấy quan điểm của bạn. – Zaid

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