【问题标题】:Get a specific line of a file in Unix [closed]在Unix中获取文件的特定行[关闭]
【发布时间】:2013-06-24 15:27:40
【问题描述】:

我想从文件中提取特定的行(比如第 2 行和第 4 到 6 行)并将它们重定向到命令行中的文件/将其通过管道传输到另一个程序。

哪个工具能最快/最干净地完成这项工作(sed、awk、perl、shell)?

【问题讨论】:

  • 为什么 Perl 是一个坏标签?我该如何改进这个问题?谢谢!
  • 我有点震惊,这不是一个骗局——它本质上是一个经典问题。但我不认为这是一个不好的问题。
  • 不过,这并不完全是一个骗局,因为这个问题询问如何获得一条线,然后是一个范围。
  • 现在我想了想,这个问题就像购物一样(因为它意味着您已经知道哪些工具可用并且只想知道哪个最好) .最好简单地询问如何从文件中选择任意行(单独的行和范围)而不假设工具链的任何内容。关于清洁度和速度的部分不言而喻。

标签: perl shell unix awk sed


【解决方案1】:

Sed 有一个很好的方法:

sed -ne '2p' -e '4,6p'

例如:

$ printf '%s\n' {1..100} | sed -ne '2p' -e '4,6p'
2
4
5
6

【讨论】:

    【解决方案2】:
    awk 'NR==2 || NR>=4 && NR<=6'
    

    awk 'NR==2; NR==4,NR==6'
    

    【讨论】:

      【解决方案3】:

      使用awk 及其参数NR。您可以编写条件表达式,例如:

      $ cat a
      aa
      bb
      cc
      dd
      ee
      $ awk 'NR==3' a #print line number 3
      cc
      $ awk 'NR==3, NR==5' a #print from line number 3 up to number 5
      cc
      dd
      ee
      $ awk 'NR>2 && NR<7' a #print lines whose number is in the range (2,7)
      cc
      dd
      ee
      

      等等

      在你的情况下,

      $ awk 'NR==2; NR>=4 && NR<=6' a #print line number 2 and from 4 to 6
      

      【讨论】:

        【解决方案4】:

        您只需使用headtail 就可以做到这一点...

        例如:

        NR=3; cat test.txt | head -n $NR | tail -n -1
        

        test.txt中提取第3行;和

        NB=2; NR=3; cat test.txt | head -n $(expr $NR \+ $NB) | tail -n -$NB
        

        提取第 3 至 5 行。

        【讨论】:

          【解决方案5】:

          使用 awk 并保持简洁:

          awk 'NR==2 || (NR>=4 && NR<=6)' file
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-08
            • 1970-01-01
            • 2011-05-18
            相关资源
            最近更新 更多