[英]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)
使用head
和tail
依次获取文件的各行部分,而不是使用cat。
选项3)
用适当的语言重写,以避免所有这些额外过程的开销。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.