繁体   English   中英

如何从文件中读取行,将其存储并从UNIX中最后存储的行重新开始

[英]How to read lines from file, storing it and again start from the last stored line in UNIX

Shell脚本需要读取一批行(首先说150行)。 然后将该值存储在变量中。 执行完SQL之后,现在应该从151读取到300。这样,它将以150批读取行,并将其存储在变量中,直到读取32000行。

脚本看起来像

   #!/bin/bash  
    t2val=$(cat /home/trnid | tr '\n' ',' | sed 's/,$//')  
    sqlplus -s <username>/<passwd>@dbname  > /home/file << EOF  
    set echo on  
    set pagesize 0  
    set verify off
    set lines 32000
    set trimspool on
    set feedback off
   SELECT *  
  FROM <dbname>.<tablename1> tr  
  LEFT JOIN <tablename2> t2 ON t2.id2 = tr.id1  
  LEFT JOIN <tablename3> t3 ON t3.id2 = tr.id1  
  LEFT JOIN <tablename4> t4 ON t4.id2 = tr.id1  
  WHERE tr.TIMESTAMP > SYSDATE - 75 / 1440  
  AND tr.TIMESTAMP <= SYSDATE - 15 / 1440  
  and t2.value in ( "t2val")  
  order by timestamp; 
   exit;
  EOF

trnid有32000行,每行包含11位数字。 在这里,变量t2val具有32000个值,以逗号分隔。 但是该脚本的运行价值不高。 因此,我需要将其划分为少于2499个字符,因此大约需要从trnid文件中提取150个条目。 我想以150个批次进行选择,然后将其放入t2val列(以逗号分隔),直到到达第32000行。 我认为以这种方式,如果您有比较净的想法要采用t2val <2499列的值,请告知。 或者以我的方式帮助我(在SQL中执行150个条目的批处理)。

看起来您要将这些值存储在ORacle DB中。 为什么不使用批量加载器?

另一个解决方案是使用perl

没有错误处理的伪代码:

open (FH, "<filename");
my $count = 0;
my $buffer = ();
while(<FH>) {
  push($buffer,split);
  $count++;
  if($count % 150 == 0) {
    saveToDB($buffer);
    $buffer = ();
  }
}

在这里saveToDB可以轻松地将值存储在DB中,例如通过DBI

选项1)

使用split/home/trnid创建一组临时文件,然后对这些临时文件进行迭代和cat等操作。 (除了您不需要使用cat,只需将其重定向到tr

选项2)

使用headtail依次获取文件的各行部分,而不是使用cat。

选项3)

用适当的语言重写,以避免所有这些额外过程的开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM