如何从文件中读取行,存储它,然后从UNIX中的最后一个存储行开始

时间:2010-10-22 08:21:12

标签: bash shell

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的值&lt; 2499,请指教。或者按照我的想法帮助我(在SQL中执行150个条目的批处理)。

2 个答案:

答案 0 :(得分:2)

看起来您将这些值存储在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 :(得分:1)

选项1)

使用split/home/trnid创建一组临时文件 然后在这些临时文件上迭代并cat等。 (除非您不需要使用cat,只需重定向到tr

选项2)

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

选项3)

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