2012-10-22 35 views
5

Tôi có một tệp rất lớn mà từ đó tôi cần phải xóa một dòng cụ thể (số dòng 941573)Làm thế nào để xóa một dòng cụ thể từ một tập tin trong Unix?

Tôi có phần mới với môi trường này, nhưng tôi đã giải quyết được vấn đề này.

Tôi đã thử bằng cách sử dụng lệnh sed như vậy, nhưng nó dường như không được làm việc

sed -e '941572,941574d' filenameX > newfilenameY 

Tôi cũng đã thử

sed -e '941573d' filenameX > newfilenameY 

Tuy nhiên file 'newfilenameY' và tệp gốc 'filenameX' cả hai vẫn chứa dòng mà tôi đang cố xoá. Đó là một tập tin fastq, mặc dù tôi không thấy làm thế nào mà sẽ làm cho bất kỳ sự khác biệt. Giống như tôi đã nói tôi mới đến unix nên có lẽ tôi đã nhận được lệnh sed sai

+0

Tôi vừa thử phương pháp này (với tệp nhỏ hơn nhiều) và tất cả dường như hoạt động. Có lẽ bạn muốn kiểm tra lại? –

+0

Tôi có, khá một vài lần –

+0

Tôi sẽ đề nghị bạn chạy 'sed -ne' 941573p 'filenameX' để xem sed có đếm số dòng theo cách bạn mong đợi. –

Trả lời

6

d xóa một dòng/dòng. Cách tiếp cận thứ hai của bạn hoạt động.

$ sed '941573d' input > output 

dài Ví dụ:

% for i in $(seq 1000000) 
do 
echo i >> input 
done 
% wc -l input 
1000000 input 
% sed '941573d' input > output 
% wc -l output 
999999 output 
% diff -u input output          :(
--- input  2012-10-22 13:22:41.404395295 +0200 
+++ output  2012-10-22 13:22:43.400395358 +0200 
@@ -941570,7 +941570,6 @@ 
941570 
941571 
941572 
-941573 
941574 
941575 
941576 

ngắn Ví dụ:

% cat input 
foo 
bar 
baz 
qux 
% sed '3d' input > output 
% cat output    
foo 
bar 
qux 
+2

Làm thế nào điều này khác với những gì OP đang làm, ngoài các -e, mà (tôi nghĩ) nên làm cho không có sự khác biệt? –

+0

@BrianAgnew Không có sự khác biệt. Cách tiếp cận thứ hai của OP hoạt động. –

+0

Đó là những gì tôi nghĩ –

0

Dưới đây là làm thế nào để loại bỏ một hoặc nhiều dòng từ một tập tin.

Cú pháp:

sed '{[/]<n>|<string>|<regex>[/]}d' <fileName>  
sed '{[/]<adr1>[,<adr2>][/]d' <fileName> 
/.../=delimiters 
n = line number 
string = string found in in line 
regex = regular expression corresponding to the searched pattern 
addr = address of a line (number or pattern) 
d = delete 
0

tôi tạo ra một tập tin thử nghiệm với 1000000 dòng và cố gắng sed -e '941573d' filenameX > newfilenameY của bạn và nó hoạt động tốt trên Linux.

Có thể chúng tôi có một số hiểu lầm khác. Số dòng đếm từ một, không phải số không. Nếu bạn tính từ số không thì bạn sẽ thấy dòng 941572 bị thiếu.

Bạn đã thử một diff filenameX newfilenameY? Điều đó sẽ làm nổi bật bất kỳ thay đổi bất ngờ nào.

Tôi không biết nhiều về định dạng FASTQ, nhưng bạn có chắc chắn chúng ta đang nói về số dòng tệp văn bản chứ không phải số thứ tự không?

Có giới hạn độ dài dòng chung là 4096 byte, có bất kỳ dòng nào của bạn vượt quá giới hạn đó không? (Điều đó là không, nhưng tôi nghĩ nó đáng giá).

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