【问题标题】:Linux, big text file, strip out content from line A to line BLinux,大文本文件,从 A 行到 B 行剥离内容
【发布时间】:2010-12-08 17:43:32
【问题描述】:

我想从一个大文本文件中删除一大块行。我知道开始和结束行号。将内容(A 和 B 之间的行)导出到某个文件的最优雅的方法是什么?

我知道 head 和 tail 命令 - 还有更快(一步)的方法吗?

文件超过 5GB,包含超过 81 条 mio 行。

已更新:结果

time sed -n 79224100,79898190p BIGFILE.log > out4.log
real    1m9.988s

time tail -n +79224100 BIGFILE.log | head -n +`expr 79898190 - 79224100` > out1.log
real    1m11.623s

time perl fileslice.pl BIGFILE.log 79224100 79898190 > out2.log
real    1m13.302s

time python fileslice.py 79224100 79898190 < BIGFILE.log > out3.log
real    1m13.277s

获胜者是 sed。最快的,最短的。我认为 Chuck Norris 会使用它。

【问题讨论】:

  • 有人在 3..2..1.. 中提出了 PERL 单行代码。
  • 很高兴看到它们都在几秒钟之内。
  • 我有同样的问题:第二个 sed 解决方案更好:它不解析所有文件: time sed -n "16265315,16271356 p" diff.txt real 0m9.180s time sed -n " 16265315,$ p; 16271356 q" diff.txt 真实 0m2.064s

标签: linux shell


【解决方案1】:
sed -n '<A>,<B>p' input.txt

【讨论】:

  • 试过这个,但它似乎被大数字阻塞了。
  • sed -n 79224100,79898190p bigfile.txt > smallfile.txt
  • 这个:awk 'NR==79224100,NR==79898190' bigfile.txt > smallfile.txt 也不适用于大数字。
  • 关于窒息的错误信息。只是不够耐心。
【解决方案2】:

这在 GNU sed 中对我有用:

sed -n 'I,$p; Jq'

q 在处理指定的行时退出。

例如,这些大数字有效:

$ yes | sed -n '200000000,${=;p};200000005q'
200000000
y
200000001
y
200000002
y
200000003
y
200000004
y
200000005
y

【讨论】:

    【解决方案3】:

    我猜大文件需要更大的解决方案...

    fileslice.py:

    import sys
    import itertools
    
    for line in itertools.islice(sys.stdin, int(sys.argv[1]) - 1, int(sys.argv[2])):
      sys.stdout.write(line)
    

    调用:

    python fileslice.py 79224100 79898190 < input.txt > output.txt
    

    【讨论】:

      【解决方案4】:

      这是一个 perl 解决方案 :)

      fileslice.pl:

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      use IO::File;
      
      my $first = $ARGV[1];
      my $last = $ARGV[2];
      my $fd = IO::File->new($ARGV[0], 'r') or die "Unable to open file $ARGV[0]: $!\n";
      my $i = 0;
      while (<$fd>) {
          $i++;
          next if ($i < $first);
          last if ($i > $last);
          print $_;
      }
      

      开始

      perl fileslice.pl file 79224100 79898190
      

      【讨论】:

        猜你喜欢
        • 2017-04-04
        • 2018-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-04
        • 1970-01-01
        相关资源
        最近更新 更多