【问题标题】:extract multiple lines of a file unix提取文件的多行 unix
【发布时间】:2014-01-22 22:38:14
【问题描述】:

我有一个包含 400,000 行的文件 A。我有另一个文件 B 有一堆行号。

File B:  
-------
98  
101
25012
10098
23489

我必须从文件A中提取文件B中指定的那些行号。即我想从文件A中提取第98,101,25012,10098,23489行。在以下情况下如何提取这些行。

  1. 文件 B 是显式文件。
  2. 文件 B 从管道中到达。例如,grep -n pattern somefile.txt 给了我文件 B。

我想使用see -n 'x'p fileA。但是,我不知道如何从文件中给出“x”。另外,我不知道如何从命令中传递“x”的值。

【问题讨论】:

    标签: shell unix command-line


    【解决方案1】:

    sed可以打印你想要的行号:

    $ printf $'foo\nbar\nbaz\n' | sed -ne '2p'
    bar
    

    如果你想要多行:

    $ printf $'foo\nbar\nbaz\n' | sed -ne '2p;3p'
    bar
    baz
    

    要将一组行转换为这样的sed 命令,请使用sed 来获得漂亮的sedception:

    $ printf $'98\n101' | sed -e 's/$/;/'
    98;
    101;
    

    把它们放在一起:

    sed -ne "$(sed -e 's/$/p;/' B)" A
    

    测试:

    $ cat A
    1
    22
    333
    4444
    $ cat B
    1
    3
    $ sed -ne "$(sed -e 's/$/p;/' B)" A
    1
    333
    

    QED。

    【讨论】:

    • 你的意思是s/$/p;/ 对吗?如果在 fileB 中有 30k 行,这也行吗?
    • 当我只执行这个 $(sed -e 's/$/p;/' B) 时,它会显示每个行号;在一个新行中。那是 98;\n101;\n。因此,当我总共运行命令 sed -e $(sed -e 's/$/;/' B) A 时,我收到错误“sed: 31494p;: No such file or directory”。我认为第一个带有 fileB 的 sed 也应该删除换行符。
    • 抱歉,我没有测试最后一条语句。已更正。
    【解决方案2】:

    awk 更适合这个任务:

    文件箱中的fileA:

    awk 'NR==FNR{a[$0]=1;next}a[FNR]' fileB fileA
    

    fileA 来自管道的内容:

    cat fileA|awk 'NR==FNR{a[$0]=1;next}a[FNR]' fileB -
    

    哦,您希望 FileB 在文件中或从管道中,然后是相同的 awk cmd:

    awk '...' fileB fileA
    

    cat fileB|awk '...' - fileA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2014-04-21
      • 2021-09-28
      • 2010-09-10
      • 2023-03-25
      • 2013-02-02
      相关资源
      最近更新 更多