使用Linux根据最小/最大值过滤一个非常大的,按数字排序的CSV文件?

Kev*_*uro 2 linux csv bash awk sed

我正在尝试输出相当大的CSV文件行.在过去,我尝试了不同的东西,最终发现Linux的命令行界面(sed,awk,grep等)是处理这些类型文件的最快方法.

我有一个这样的CSV文件:

1,rand1,rand2
4,randx,randy,
6,randz,randq,
...
1001,randy,randi,
1030,rando,randn,
1030,randz,randc,
1036,randp,randu
...
1230994,randm,randn,
1230995,randz,randl,
1231869,rande,randf
Run Code Online (Sandbox Code Playgroud)

虽然第一列在数值上增加,但每个数字之间的间距随机变化.我需要能够在第一列中输出值在X和Y之间的所有行.

就像是:

sed ./csv -min --col1 1000 -max --col1 1400
Run Code Online (Sandbox Code Playgroud)

这将输出第一列值介于1000和1400之间的所有行.

这些行不同,在> 5 GB的文件中可能只有大约5个重复,所以如果它只重复一次重复,那就没什么大不了 - 但如果它抛出一个错误就会大不了由于重复的线条.

我可能不知道是否存在特定的线值(例如,1000是粗略估计并且不应该假设存在作为第一列值).

mkl*_*nt0 5

对于大文件,优化很重要; 以下awk命令:

  • 参数化(使用变量来定义范围边界)
  • 仅对范围之前的记录执行单个比较.
  • 一旦找到最后一个感兴趣的记录就退出.
awk -F, -v from=1000 -v to=1400 '$1 < from { next } $1 > to { exit } 1' ./csv
Run Code Online (Sandbox Code Playgroud)

因为awk执行数值比较(输入字段看起来像数字),范围边界不需要精确匹配字段值.