【问题标题】:How to read lines from file, storing it and again start from the last stored line in UNIX如何从文件中读取行,存储它并再次从 UNIX 中最后存储的行开始
【发布时间】:2010-10-22 08:21:11
【问题描述】:

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

【问题讨论】:

  • this question 完全相同;你不喜欢我的 sqlldr 答案吗?
  • @Benoit 我喜欢你的 sqlloader 答案 :-) 唯一的问题是我只在数据库上作为用户级别工作。我没有管理员权限:-(所以,我在我的家庭驱动器上制作这些脚本,使用我的登录名和密码并运行它们。所以,你觉得我可以使用 SQL 加载器吗?
  • Ashish,你有权创建临时表吗?如果是这样,您仍然可以将“插入”打印到该表中......

标签: bash shell


【解决方案1】:

看起来您将这些值存储在 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

【讨论】:

    【解决方案2】:

    选项 1)

    使用split/home/trnid 创建一组临时文件 然后在这些临时文件上迭代和cat 等。 (除了不用cat,直接重定向到tr即可)

    选项 2)

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

    选项 3)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 2017-08-02
      相关资源
      最近更新 更多