2012-10-22 150 views
5

我有一個非常大的文件,我需要刪除一個特定的行(行號941573)如何從unix中的文件中刪除特定的行?

我對這個環境有點新,但我一直在使用googling這個問題無濟於事。

我使用sed命令這樣嘗試過,但似乎並不奏效

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

我也試過

sed -e '941573d' filenameX > newfilenameY 

然而,「newfilenameY」文件和原始文件'filenameX'都包含我試圖刪除的行。這是一個fastq文件,但我不明白這會帶來什麼影響。就像我說我是新來的unix所以也許我已經得到了sed命令錯誤

+0

我剛剛嘗試過這種方法(與一個更小的文件),它似乎工作。也許你想重新檢查? –

+0

我有很多次 –

+0

我建議你運行'sed -ne'941573p'filenameX'來查看sed是否按照你期望的方式計算行數。 –

回答

6

d刪除一行/線。所以你的第二種方法有效。

$ sed '941573d' input > output 

龍示例:

% 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 

短示例:

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

這與OP所做的不同之處是什麼?除了-e,哪(我認爲)應該沒有區別? –

+0

@BrianAgnew沒有區別。 OP的第二種方法起作用。 – 2012-10-22 11:18:44

+0

這就是我認爲 –

0

下面是如何從文件中刪除一個或多個行。

語法:

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

我生成的測試文件與百萬行,並試圖您sed -e '941573d' filenameX > newfilenameY,它在Linux上工作得很好。

也許我們還有一些其他的誤解。行號從1開始計數,而不是零。如果你從零開始計算,那麼你會發現941572行缺失。

你試過diff filenameX newfilenameY嗎?這將突出任何意想不到的變化。

我對FASTQ格式不太瞭解,但您確定我們正在討論文本文件行號,而不是序列號?

有一個4096字節的一般行長度限制,你的任何行超過了? (這不太可能,但我認爲這是值得的問題)。

相關問題