【问题标题】:Read lines between two lines specified by their line number读取由行号指定的两行之间的行
【发布时间】:2015-04-19 16:57:38
【问题描述】:

如何读取两个特定行之间的所有行?

假设第 23 行是我要开始的地方,第 56 行是要读取的最后一行,但它不是文件的结尾。

我将如何阅读第 23 到 56 行?我会将它们输出到另一个文件。

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    使用awk 可以很容易地按行号:

    awk 'NR >= 23 && NR <= 56'
    

    无论哪种方式,sed 都很有趣。

    sed '23,56!d'
    

    或者对于一个模式,

    sed '/start/,/end/!d'
    

    【讨论】:

    • @Kevin awk 'NR &gt;= 23 &amp;&amp; NR &lt;= 56' file 不这样做,请您提供完整的命令
    • @oleg 它适用于我的,也许你的awk 没有执行默认操作。试试awk 'NR &gt;= 23 &amp;&amp; NR &lt;= 56 { print $0 }' file
    • time awk 'NR &gt;= 50000 &amp;&amp; NR &lt;= 60000' qwe &gt; /dev/null = 0m0.069s
    【解决方案2】:

    我会选择 sed,但也可以使用头/尾组合: 罢工>

    head -n 56 file | tail -n $((56-23)) 
    

    嗯 - 我很确定里面有一个错误。我要找到它。 :)

    更新:

    哈哈 - 知道你的错误,我找到了:

    head -n 56 file | tail -n $((56-23+1)) 
    

    【讨论】:

    • !!!这真的很有趣!使用 100,000 行的文件 time sed -n 50000,60000p qwe &gt; /dev/null = 0m0.015s 和 time (head -n 60000 qwe | tail -n 10000 &gt; /dev/null) = 0m0.003s -- 保持简单
    • 与 sed 相比,在大多数情况下,您通过键入头/尾组合(并找到一个错误)所浪费的时间比您节省的时间要多。
    • 这一切都取决于命令的目的 - 如果它是一些经常执行的作业的一部分,那么它是值得的
    • 是的。对我来说,这更像是一份一次性工作。使用一些自己的文件进行测试,字典有足够的长度(ogerman、utf-german、pgdict)我得到较小的差异(1:2 到 1:4)。
    • @Oleg 在 sed 上使用 60000q,我的 sed 运行速度是 head|tail 的两倍。没有它,它们的运行速度大致相同。你确定你的时间吗?
    【解决方案3】:

    Sed 可以做到这一点:

    $ sed -n 23,56p yourfile

    编辑:正如评论者指出的那样,在间隔的最后一行之后停止处理 sed 将使 sed 的执行速度与头尾组合一样快。所以获得线条的最佳方式是

    $ sed -n '23,56p;57q' yourfile

    但性能在很大程度上取决于您正在处理的文件、时间间隔和许多其他因素。因此,如果您正在开发一些脚本以在已知数据上频繁运行,测试答案中提到的所有三种方法(sed、awk、head-tail)将是一个好主意。

    【讨论】:

    • 好吧,sed 比head-tail 组合(单个进程)具有更好的性能,特别是如果您正在这样做:sed -n '23,56p;57q' FILE
    • 1+ for Zsoft:我喜欢 57q -- 之后不再处理 -- 非常酷。
    【解决方案4】:

    使用 sed。这应该这样做。

       sed -n '23,56p' > out.txt
    

    【讨论】:

      【解决方案5】:

      这可能对你有用:

      sed '1,22d;56q' file
      

      或者这个:

      sed '23,56!d;56q' file
      

      或者这个:

      awk 'NR>56{exit};NR==23,NR==56' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多