2016-11-14 6 views
0

私はp.txtという名前のファイルが1つあります。 これは、値が次のものが含まれます。特定の長さのバッチでUNIXからファイルを読み込みます

201601 
201602 
201603 
201604 
201605 
201606 
201607 
201608 
201609 
201610 

私は 一つの変数は、最初の反復における三つの値

201601 
201602 
201603 

以下になります。3.すなわちのバッチで、このレコードを読みたいです。 2回目の繰り返しでは、次の3行が表示されます

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に挿入を実行します。私はより良いパフォーマンスのために3つの期間これらのクエリをしたい。

/* Update NULL LOCL_SEGMNT3_IDNs*/ 
INSERT INTO T 
SELECT * 
FROM A 
WHERE PERIOD IN (201601,201602,201603); 

答えて

1

この単純なコードから始めてください。あなたの意志でそれを変更してください:

cat p.txt | while read a; 
do 
    read b; 
    read c; 
    echo $a $b $c; 
done 

変数a、b、cは3つの値を持っています。

+0

3で割り切れるとうまくいきますが、そうでなければ失敗しています(201601 ,,)。 –

+1

3つのグループの行を処理したいとします。最後のグループに2つまたは1つの項目しかない場合は、必要な方法で処理します。たとえば、 "if"ステートメント。 – quantummind

2

bashには、一度にn行を読み取るストレートフォワードツール/ルーチンはありません。だから、readコマンドの上にwhileループオプション(-L)を使用して、3行を読み、使用してxargsの組み合わせ、のようなもの:

# '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行ごとの出力を変数または配列に格納することです。

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オプションを操作することによって、あなたはあなたが必要なものを達成できることを意味。

また、心の中で次のコマンドを保つ:bashで

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 

配列はゼロからカウントを開始します。

mapfile -O1 var<file 

PS:実際-O1の両方VARに最初の配列値/第一のファイルの行を割り当て[0]とするvar [ あなたは-O1オプションを使用して1から出発することにより配列をマッピングするマップファイルを強制することができ1]の位置にある。したがって、デフォルトのvar [0] -var [1] -var [2]

の代わりに、arrayの1-2-3行をvar [1] -var [2] -var [3]と呼ぶことができます。

GV

関連する問題