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(这将是最佳的契约)。此外,该数据的格式可能与显示的不同,如果这样可以使任务更容易。
答案 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}
相关的操作。
为此,您可以使用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?端