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

Unix 在另一个文件中指定的命令行输出行,unix,command-line,text-processing,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

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(实际上,这将是最佳的)。此外,如果这会使任务更容易,则该数据的格式可能与显示的格式不同

这可以是一种方法:

$ awk 'FNR==NR {a[$1]; next} FNR in a' file_with_line_numbers file_with_data
many lines 
more lines
even more lines
它读取带有行号的
文件,并将行存储在数组
a[]
中。然后,它读取另一个文件并不断检查行号是否在数组中,在这种情况下,将打印行号

使用的技巧如下:

awk 'FNR==NR {something; next} {other things}' file1 file2
它在
{something}
块中执行与
file1
相关的操作,然后在
{other things}
块中执行与
file2
相关的操作


如果行号是通过stdin给出的呢? 为此,您可以使用
awk'…'-file
,以便使用
-
调用stdin。这就是所谓的。因此,您可以:

your_commands | awk 'FNR==NR {a[$1]; next} FNR in a' - file_with_data
试验
这可以是一种方法:

$ awk 'FNR==NR {a[$1]; next} FNR in a' file_with_line_numbers file_with_data
many lines 
more lines
even more lines
它读取带有行号的
文件,并将行存储在数组
a[]
中。然后,它读取另一个文件并不断检查行号是否在数组中,在这种情况下,将打印行号

使用的技巧如下:

awk 'FNR==NR {something; next} {other things}' file1 file2
它在
{something}
块中执行与
file1
相关的操作,然后在
{other things}
块中执行与
file2
相关的操作


如果行号是通过stdin给出的呢? 为此,您可以使用
awk'…'-file
,以便使用
-
调用stdin。这就是所谓的。因此,您可以:

your_commands | awk 'FNR==NR {a[$1]; next} FNR in a' - file_with_data
试验
使用sed,将行号转换为sed程序,并使用生成的程序打印想要的行

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

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

$ sed -n "$( sed 's/$/p/' second_file )" first_file
many lines 
more lines
even more lines
这也行得通

每行(“
cat file2
”) 弗雷奇?sed-n“$line p”文件1 弗雷奇?结束

多行 更多线路 甚至更多的行

这也行

每行(“
cat file2
”) 弗雷奇?sed-n“$line p”文件1 弗雷奇?结束

多行 更多线路
甚至更多的线

非常聪明的方法。我不知道
sed-n“2p>3p”文件可以工作。我在cmd.exe上没有得到这个工作。awk thingens可以工作。我得到
sed:-e表达式2,字符2:未知命令:(“
-我的路径中似乎有一个非常旧的sed,即使使用4.2它也不起作用。此脚本似乎与不兼容windows@vlad_tepesch,为什么要将问题标记为“unix”如果你在windows中工作?@glennjackman,因为我希望unix风格操作系统附带的常用命令行文本处理工具具有一些魔力,因为windows基本上缺少这类工具。通常我安装了这类工具,它们的工作原理与unix完全相同。非常聪明的方法。我不知道这是什么ed-n“2p>3p”文件
可以工作。我在cmd.exe上没有得到这个工作awk thingens可以工作我得到了
sed:-e expression#2,char 2:Unknown命令:(“
-似乎一个非常旧的sed在我的路径中,即使使用4.2它也不工作。似乎这个脚本与windows@vlad_tepesch,你为什么在问题上加标签“unix"如果您在windows中工作?@glennjackman,因为我想让unix风格操作系统附带的常用命令行文本处理工具具有一些魔力,因为windows基本上缺少这类工具。通常我安装了这类工具,它们的工作原理与unix完全相同。有没有办法避免使用
文件行_数字
并改用标准输入法?可能吧。请举例说明如何给出标准输入法(格式等)通过更新您的原始帖子。由于我通过管道从其他文本操作命令收集这些行号,因此输入格式并不重要,因为我可以很容易地进行调整。但首先让我们假设它与文件中的相同-每行一个数字。有没有办法避免使用行号的
文件
,并使用stdin相反?可能吧。举个例子说明你的标准输入码是如何给出的(格式等)通过更新您的原始帖子。由于我通过管道从其他文本操作命令中收集这些行号,因此输入格式并不重要,因为我可以非常轻松地进行调整。但首先让我们假设它与文件中的行号相同-每行一个数字。