如何在Unix中从文件中删除特定行?

9

我有一个非常大的文件,需要删除其中特定的一行(第941573行)。

我对这个环境还比较陌生,但是我已经搜索了这个问题,但没有找到解决方法。

我尝试使用sed命令进行操作,但似乎并没有起作用。

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

我也尝试过。
sed -e '941573d' filenameX > newfilenameY

然而,'newfilenameY'文件和原始文件'filenameX'仍然包含我要删除的行。虽然它是一个fastq文件,但我不知道这会有什么影响。就像我说的,我对Unix很陌生,也许我使用sed命令时出了问题。


我刚刚尝试了这种方法(使用一个更小的文件),似乎一切都正常。也许你想重新检查一下? - Brian Agnew
我建议您运行 sed -ne '941573p' filenameX 来查看 sed 是否按照您的预期计算行号。 - Janito Vaqueiro Ferreira Filho
3个回答

10

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
除了-e参数外,这与OP正在做的有何不同(我认为)不应该有任何区别? - Brian Agnew
@BrianAgnew 没有区别。OP的第二种方法是有效的。 - user647772
第二种方法不行,伙计们,我一早上都在尝试:/ - John Smith
1
那么你的问题是不完整的。正如你从我的两个例子中看到的,d 是有效的。你的问题缺少什么信息? - user647772

1

以下是如何从文件中删除一行或多行的方法。

语法:

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
我生成了一个1000000行的测试文件,并尝试了你的sed -e '941573d' filenameX > newfilenameY,在Linux上运行良好。
也许我们有其他的误解。行号从一开始计数,而不是零。如果你从零开始计算,那么你会发现941572行缺失了。
你尝试过diff filenameX newfilenameY吗?这将突出显示任何意外更改。
我不太了解FASTQ格式,但你确定我们谈论的是文本文件行号,而不是序列号码吗?
通常有一个4096字节的普遍行长度限制,你的任何行超过了吗?(那很不可能,但我认为这个问题值得问一下)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接