lire les fichiers d’unix dans un lot d’une certaine longueur

J’ai un fichier nommé p.txt. Il contient les valeurs suivantes:

201601 201602 201603 201604 201605 201606 201607 201608 201609 201610 

Je veux lire ces enregistrements en lot de 3. ie une variable aura les trois valeurs suivantes

 201601 201602 201603 

en première itération. en deuxième itération il aura les trois lignes suivantes

 201604 201605 201606 

Si le nombre n’est pas complètement divisé par 3, l’itération sera le diviseur +1.

comment est-ce possible dans unix?

Ce que j’ai essayé jusqu’ici:

 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 

Le code actuel lit chaque ligne et exécute l’insertion dans la firebase database. Je veux avoir ces requêtes pour 3 périodes pour de meilleures performances.

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

Essayez de commencer avec ce code simple. Modifiez-le à votre guise:

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

Les variables a, b, c ont les 3 valeurs.

bash n’a pas d’outils / routines simples pour lire n lignes à la fois. Donc, une combinaison de xargs avec la lecture de 3 lignes en utilisant l’option ( -L ) et en utilisant la commande while-loop over read , quelque chose comme:

 # 'count' a local counter variable, incremented in while-loop # 'file' is sample input file $ count=1; xargs -L 3 %d\n%s\n" "$(( count++ ))" "${line// /$'\n'}"; done 

Et il produit une sortie comme

 Iteration-->1 201601 201602 201603 Iteration-->2 201604 201605 201606 Iteration-->3 201607 201608 201609 Iteration-->4 201610 

Vous pouvez optimiser ma solution pour stocker chaque sortie sur 3 lignes dans une variable ou un tableau.

Juste pour mémoire, la méthode mapfile / readarray bash pourrait convenir.

Exemples:

 mapfile -n3 varA 

Cela signifie qu'en manipulant l'option -s, vous pouvez obtenir ce dont vous avez besoin.

Gardez également à l'esprit les commandes suivantes:

 mapfile var 

Les tableaux dans bash commencent à compter à partir de zéro. Vous pouvez forcer mapfile à mapper un tableau en partant de 1 en utilisant l'option -O1:

 mapfile -O1 var 

PS: En fait, -O1 assigne la première ligne de valeur de tableau / premier fichier aux positions var [0] et var [1]. Ainsi, vous pourrez vous référer à la ligne 1-2-3 du tableau comme var [1] -var [2] -var [3] au lieu de var [0] -var [1] -var par défaut [2]

GV