如果我有一个包含许多行和列 ( data.txt
) 的分隔文件:
346 dfd asw 34
565 sd wdew 34
667 ffg wew 23
473 sa as 21
533 jhf qwe 54
和另一个我要提取的带有行号的文件 ( positions.txt
)
3
5
8
如何使用该positions.txt
文件从中提取这些位置data.txt
?这是我对此示例的预期结果:
667 ffg wew 23
533 jhf qwe 54
只需
awk
:NR==FNR{ ... }
- 处理第一个输入文件(即positions.txt
):pos[$1]
- 累积位置(记录编号)设置为pos
数组键next
- 跳到下一条记录FNR in pos
- 在处理第二个输入文件时data.txt
(FNR
表示从当前输入文件中读取了多少条记录)。仅当当前记录号FNR
在位置数组中时才打印记录pos
(搜索键)样本输出:
sed
首先从文件中创建一个脚本positions.txt
:这将输出
这个简单的脚本只会打印指定的行。
然后将其应用于
data.txt
文件。如果您正在使用bash
(或任何理解进程替换的 shell<( ... )
):除了给定脚本明确打印的内容之外,
-n
停止sed
输出任何内容。sed
通过给出的示例,这将产生
如果不使用
bash
,那么...会做同样的事情。
如果
positions.txt
已排序,也可以通过两个文件一次性完成此操作,而无需positions.txt
完整存储。positions.txt
当遇到上一个匹配行时,只需读取下一行:在实践中,这仅在两个文件都非常大或者您的内存非常非常低时才有用。
我们可以通过简单的 for 循环来做到这一点
Method1 使用 sed 和 for 循环
输出
Method2 使用 awk 和 for 循环
输出