【问题标题】:commandline output lines that are specified in another file在另一个文件中指定的命令行输出行
【发布时间】:2014-09-17 18:05:50
【问题描述】:

我正在搜索一些命令行,该命令行接受一个文本文件和一个带有行号的文件(每行一个)(或者来自标准输入),并且只输出第一个文件中的那些行。

文本文件可能有数百 MB 大,行列表可能包含数千个条目(但按升序排序)

简而言之:

  • 一个文件包含数据
  • 另一个文件包含索引
  • 命令应该只提取索引行

第一个文件:

many lines 
of course they are all very different
and contain very important data
...
more lines
...
even more lines

第二个文件

1
5
7

预期输出

many lines 
more lines
even more lines

第二个(行号)文件不一定必须存在。它的数据也可能来自标准输入(实际上这将是最佳的)。此外,如果这会使任务更容易,该数据的格式可能与显示的不同。

【问题讨论】:

    标签: unix command-line text-processing


    【解决方案1】:

    这可以是一种方法:

    $ awk 'FNR==NR {a[$1]; next} FNR in a' file_with_line_numbers file_with_data
    many lines 
    more lines
    even more lines
    

    它读取file_with_line_numbers 并将行存储在数组a[] 中。然后它读取另一个文件并不断检查行号是否在数组中,在这种情况下打印该行。

    使用的技巧如下:

    awk 'FNR==NR {something; next} {other things}' file1 file2
    

    {something} 块中执行与file1 相关的操作,然后在{other things} 块中执行与file2 相关的操作。


    如果行号是通过标准输入给出的呢?

    为此,您可以使用awk '...' - file,以便使用- 调用标准输入。这称为Naming Standard Input。这样你就可以做到:

    your_commands | awk 'FNR==NR {a[$1]; next} FNR in a' - file_with_data
    

    测试

    $ echo "1
    5
    7" | awk 'FNR==NR {a[$1]; next} FNR in a' - file_with_data
    many lines 
    more lines
    even more lines
    

    【讨论】:

    • 有没有办法避免file_with_line_numbers 而使用标准输入?
    • 可能。通过更新您的原始帖子,举例说明您的标准输入(格式等)。
    • 因为我通过管道从其他文本操作命令中收集这些行号,所以输入格式并不重要,因为我可以很容易地适应它。但首先让我们假设它与文件中的相同 - 每行一个数字。
    【解决方案2】:

    使用 sed,将行号转换为 sed 程序,并使用生成的程序打印出想要的行;

    $ sed -n "$( sed 's/$/p/' second_file )" first_file
    many lines 
    more lines
    even more lines
    

    【讨论】:

    • 非常聪明的方法。我不知道sed -n "2p <new line> > 3p" file 会起作用。
    • 我没有在我的 cmd.exe 上得到这个工作,awk thingens 确实工作我得到了sed: -e expression #2, char 2: Unknown command: "(" - 似乎一个非常旧的 sed 在我的路径中
    • 即使使用 4.2 也无法正常工作。好像这个脚本和windows不兼容
    • @vlad_tepesch,如果您在 Windows 中工作,为什么将您的问题标记为“unix”?
    • @glennjackman 因为我想要一些与 unix 风格操作系统一起提供的常用命令行文本处理工具的魔力,因为 Windows 很大程度上缺乏这些工具。通常我已经安装了这些工具,而且它们的工作原理和 unix 上的一样。
    【解决方案3】:

    这也有效。

    foreach 行 ("cat file2") 前锋? sed -n "$line p" file1 前锋?结束

    多行 更多线路 更多行

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2016-08-22
      • 2018-10-12
      相关资源
      最近更新 更多