如何从文件中删除大量的行

时间:2014-11-04 02:02:59

标签: bash perl sed

我有一个包含约700,000行的文件,我想使用bash脚本或其他方法删除一堆特定行(~30,000)。

我知道我可以使用sed删除行:

sed -i.bak -e '1d;34d;45d;678d' myfile.txt # an example

我在文本文件中有这些行,但我不知道是否可以将它用作sed的输入,也许是perl ??

由于

5 个答案:

答案 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(以相反的顺序对数字进行排序)。最终sedded的删除命令)添加到数字中。

然后我们发出w(写)和q(退出)命令。

请注意,这会覆盖原始文件!