我有一个包含约700,000行的文件,我想使用bash脚本或其他方法删除一堆特定行(~30,000)。
我知道我可以使用sed删除行:
sed -i.bak -e '1d;34d;45d;678d' myfile.txt # an example
我在文本文件中有这些行,但我不知道是否可以将它用作sed的输入,也许是perl ??
由于
答案 0 :(得分:2)
一些选择:
sed <(sed 's/$/d/' lines_file) data_file
awk 'NR==FNR {del[$1]; next} !(FNR in del)' lines_file data_file
perl -MPath::Class -e '
%del = map {$_ => 1} file("lines_file")->slurp(chomp => 1);
$f = file("data_file")->openr();
while (<$f>) {
print unless $del{$.};
}
'
答案 1 :(得分:2)
perl -ne'
BEGIN{ local @ARGV =pop; @h{<>} =() }
exists $h{"$.\n"} or print;
' myfile.txt lines
答案 2 :(得分:1)
您可以使用sed文件删除行。 首先列出要删除的行。 (一行一行)
$ cat lines
1
34
45
678
将此文件设为sed格式。
$ sed -e 's|$| d|' lines >lines.sed
$ cat lines.sed
1 d
34 d
45 d
678 d
现在使用这个sed文件并将其作为sed命令的输入。
$ sed -i.bak -f lines.sed file_with_70k_lines
这将删除这些行。
答案 3 :(得分:0)
如果您可以创建格式为
的文本文件1d
34d
45d
678d
然后你可以运行类似
的东西sed -i.bak -f scriptfile datafile
答案 4 :(得分:0)
您可以使用真正的编辑器,ed
是标准编辑器。
我假设您的行位于文件lines.txt
中,每行一个数字,例如,
1
34
45
678
然后(带有明显的讽刺):
ed -s file.txt < <(sed -n '/^[[:digit:]]\+$/p' lines.txt | sort -nr | sed 's/$/d/'; printf '%s\n' w q)
第一个sed
仅选择文件lines.txt
中的数字(以防万一)。
这里有一些特别需要注意的事项:当你删除第1行时,原始文件中的第34行变为第33行。所以最好从结尾删除行:从678开始,然后是45,等等这就是为什么我们使用sort -nr
(以相反的顺序对数字进行排序)。最终sed
将d
(ed
的删除命令)添加到数字中。
然后我们发出w
(写)和q
(退出)命令。
请注意,这会覆盖原始文件!