以一定长度批量读取unix中的文件

时间:2016-11-14 08:12:11

标签: shell unix

我有一个名为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); 

3 个答案:

答案 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