【问题标题】:Fast extraction of lines based on line numbers根据行号快速提取行
【发布时间】:2018-02-23 22:11:50
【问题描述】:

我正在寻找一种基于 bash 中从不同文件读取的行号列表来提取文件行的​​快速方法。

定义三个文件:

position_file:包含单列整数

full_data_file:包含单列数据

extracted_data_file:包含 full_data_file 中行号与 position_file 中的整数匹配的行

我目前的做法是

while read position; do
    awk -v pos="$position" 'NR==pos {print; exit}' < full_data_file >> extracted_data_file
done < position_file

问题是这非常慢,我正在尝试对大量相当大的文件执行此操作。我希望有人可以提出更快的方法。

感谢您的帮助。

【问题讨论】:

  • 请在您的帖子中的代码标签中发布示例 Input_file 和预期的输出文件。
  • 您应该一次性执行提取,而不是将您的 awk 调用包装在 while 循环中
  • @Aserre,我认为你是对的,问题是我一直将同一个文件加载到内存中。我是 awk 的新手,我不确定如何在一个 awk 步骤中做到这一点。请您详细说明一下吗?

标签: linux bash awk


【解决方案1】:

awk 命令的正确方法:

输入文件:

$ head pos.txt data.txt
==> pos.txt <==
2
4
6
8
10

==> data.txt <==
a
b
c
d
e
f
g
h
i
j

awk 'NR==FNR{ a[$1]; next }FNR in a' pos.txt data.txt > result.txt

$ cat result.txt
b
d
f
h
j

【讨论】:

  • 取决于在打印最后一个目标行后可能留下多少行data.txt,目标行的百分比,假设pos.txt 已排序,您可能想试试awk 'NR==FNR{ a[$1]; m=$1; next } FNR in a{print; if (FNR==m) exit}' pos.txt data.txt看看是不是更快。
猜你喜欢
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多