我有一个名为p.txt的文件。 它包含以下值:
201601
201602
201603
201604
201605
201606
201607
201608
201609
201610
我想以3批的方式阅读这些记录。 一个变量将具有以下三个值
201601
201602
201603
在第一次迭代中。在第二次迭代中,它将有接下来的三行
201604
201605
201606
如果数字未完全除以3,则迭代将为除法器+1。
unix怎么可能?
到目前为止我尝试过:
PERD=`cat P.txt`
for perd in `cat PERD_ID.txt`;
do
bteq << EOF
.logon ${conn_string};
/* Database*/
DATABASE $ET;
/* Update NULL LOCL_SEGMNT3_IDNs*/
INSERT INTO T
SELECT *
FROM A
WHERE PERIOD IN ($PERD);
.if errorcode != 0 then .exit 5.1;
.LOGOFF
.EXIT
EOF
done
当前代码读取每一行并在DB中执行insert。我希望在3个时间段内进行这些查询以获得更好的性能。
/* Update NULL LOCL_SEGMNT3_IDNs*/
INSERT INTO T
SELECT *
FROM A
WHERE PERIOD IN (201601,201602,201603);
答案 0 :(得分:2)
bash
没有任何直接的工具/例程来一次读取n
行。因此xargs
组合使用选项(-L
)读取3行并使用while {loop read
命令,如下所示:
# 'count' a local counter variable, incremented in while-loop
# 'file' is sample input file
$ count=1; xargs -L 3 <file | while read line; do printf "Iteration-->%d\n%s\n" "$(( count++ ))" "${line// /$'\n'}"; done
它产生一个输出
Iteration-->1
201601
201602
201603
Iteration-->2
201604
201605
201606
Iteration-->3
201607
201608
201609
Iteration-->4
201610
您可以优化我的解决方案,将每3行输出存储到变量或数组中。
答案 1 :(得分:1)
尝试从这个简单的代码开始。根据您的意愿修改它:
cat p.txt | while read a;
do
read b;
read c;
echo $a $b $c;
done
变量a,b,c具有3个值。
答案 2 :(得分:0)
只是为了记录,mapfile / readarray bash方法可以适合。
示例:
mapfile -n3 varA<file;echo ${varA[@]} # Get the first three lines from file and store them in a array called varA.
mapfile -s3 -n3 varB<file;echo ${varB[@]} # Skip 3 - get next three lines and store it in another array varB
mapfile -s6 -n3 varC<file;echo ${varC[@]} # Skip 6 - get next three lines, and store it in another array varC
这意味着通过操作-s选项,您可以实现所需。
还要记住以下命令:
mapfile var<file # This fills an array called var with all the lines of file. var[0] is the first line, var[1] is the second line, etc
echo ${var[@]} # Prints the whole array
echo ${var[2]} # Prints a particular array item
echo ${#var[@]} #Prints the number of elements in array = number of lines read
bash中的数组从零开始计数。 您可以通过使用-O1选项从<1开始强制mapfile映射数组:
mapfile -O1 var<file
PS:实际上-O1将第一个数组值/第一个文件行分配给var [0]和var [1]位置。因此,您将能够将数组的第1-2-3行称为var [1] -var [2] -var [3]而不是默认的var [0] -var [1] -var [2] < / p>
G.V