【问题标题】:Get a range of lines from a file given the start and end line numbers给定开始和结束行号,从文件中获取一系列行
【发布时间】:2011-01-15 07:25:16
【问题描述】:

在给定起始行号和结束行号的情况下,我需要从文件中提取一定数量的行。

如何在 unix 下快速做到这一点(它实际上是 Solaris,所以 gnu 风格不可用)。

谢谢

【问题讨论】:

标签: unix shell


【解决方案1】:

我编写了一个名为 splitter 的 Haskell 程序,它正是这样做的:有一个 read through my release blog post

您可以按如下方式使用该程序:

$ cat somefile | splitter 4,6-10,50-

这将得到第 4 行、第 6 行到第 10 行以及第 50 行。这就是它的全部。您将需要 Haskell 来安装它。只是:

$ cabal install splitter

你就完成了。我希望你觉得这个程序很有用。

【讨论】:

    【解决方案2】:

    或者

    head -n "$last" file | tail -n +"$first"
    

    【讨论】:

      【解决方案3】:

      要打印第 6-10 行:

      sed -n '6,10p' file
      

      如果文件很大,并且与行数相比,结束行数很小,您可以通过以下方式提高效率:

      sed -n '10q;6,10p' file
      

      从测试一个包含相当多行的文件:

      $ wc -l test.txt 
      368048 test.txt
      $ du -k test.txt 
      24640    test.txt
      $ time sed -n '10q;6,10p' test.txt >/dev/null
      real   0m0.005s
      user   0m0.001s
      sys    0m0.003s
      $ time sed -n '6,10p' test.txt >/dev/null
      real   0m0.123s
      user   0m0.092s
      sys    0m0.030s
      

      【讨论】:

      • AARRGGH!! :) 这比我的好
      • 我想到了,但无法让它停止打印其他行.. -n 选项.. :)
      • @Alok 10q 代表什么?如果我想得到 100,000 行,我会使用 100000q 吗?
      • @arc,是的,没错。具体来说,10q 表示对于第 10 行,运行命令q,即“退出”。所以,sed 将在第 10 行退出。
      • 您也可以使用正则表达式来定义匹配的开始和结束。
      【解决方案4】:

      你也可以用 nawk 做到这一点

      #!/bin/sh
      start=10
      end=20
      nawk -vs="$start" -ve="$end" 'NR>e{exit}NR>=s' file
      

      【讨论】:

        猜你喜欢
        • 2017-01-04
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多