命令行输出行在另一个文件中指定

时间:2014-09-10 13:40:10

标签: unix command-line text-processing

iam搜索一些命令行,该命令行接受一个文本文件和一个带行号的文件(每行一个)(或者从stdin),并仅输出第一个文件中的那些行。

文本文件可能有数百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

第二个(行号)文件不一定必须存在。它的数据也可能来自stdin(这将是最佳的契约)。此外,该数据的格式可能与显示的不同,如果这样可以使任务更容易。

3 个答案:

答案 0 :(得分:2)

这可以是一种方法:

$ 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

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


如果通过stdin给出行号怎么办?

为此,您可以使用awk '...' - file,以便使用-调用stdin。这称为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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

这也有效。

foreach line(" cat file2") 的foreach? sed -n" $ line p"文件1 的foreach?端

许多台词 更多行 甚至更多行