Как прочитать строки из файла, сохранить его и снова начать с последней сохраненной строки в UNIX - PullRequest
1 голос
/ 22 октября 2010

Сценарию оболочки необходимо прочитать пакет строк (скажем, сначала 150).затем сохранить эти значения в переменной.После выполнения SQL теперь он должен прочитать от 151 до 300. Таким образом, он будет читать строки в количестве 150 и сохранять их в переменной до тех пор, пока не будет прочитано 32000 строк.1003 *

   #!/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 символов и, следовательно, около 150 записей, которые будут взяты из файла trnid.Я хочу выбрать их в серии из 150, а затем поместить в столбец t2val (через запятую), пока не достигну 32000-й строки.Я думаю, таким образом, если у вас есть идея, чтобы принимать значения столбца t2val <2499, пожалуйста, сообщите.ИЛИ помогите мне, как я думаю (выполнение пакета из 150 записей в SQL). </p>

Ответы [ 2 ]

2 голосов
/ 22 октября 2010

Похоже, вы храните эти значения в БД ORacle. Почему бы не использовать оптовый загрузчик?

Другим решением будет использование perl

псевдокод без обработки ошибок:

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

, где saveToDB может легко сохранять значения в БД, например, через DBI

1 голос
/ 22 октября 2010

Вариант 1)

Используйте split для создания набора временных файлов из /home/trnid Затем выполните итерации и cat и т. Д. Для этих временных файлов.(За исключением того, что вам не нужно использовать cat, и вы можете просто перенаправить на tr)

Вариант 2)

Используйте head и tail для получения участков строкфайл, в свою очередь, вместо использования cat.

Вариант 3)

Перепишите на правильном языке, чтобы избежать накладных расходов на все эти дополнительные процессы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...