[Bash] Elegant file lijn-per-lijn overlopen

Pagina: 1
Acties:

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Ik zou graag het volgende doen in bash (pseudocode):
code:
1
2
3
4
for-each LINE from FILE
do
   <doe iets met de ingelezen lijn>
done


Ik kan dit momenteel doen op deze manier:
code:
1
2
3
4
( while read LINE
do
  <doe iets met ingelezen lijn>
done ) < FILE


Ik vind de constructie met het hele while blok tussen haakjes echter nogal lomp.
Ik vermoed dat er een betere manier is, maar ben er nog niet in geslaagd om deze te vinden ...

Hoe kun je dit elegant scripten?

  • PowerSp00n
  • Registratie: Februari 2002
  • Laatst online: 17-11-2025

PowerSp00n

There is no spoon

Hoeft ook helemaal niet?


code:
1
2
3
while read LINE; do
  # iets
done < /een/file

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
PowerSp00n schreef op woensdag 08 oktober 2008 @ 15:42:
Hoeft ook helemaal niet?


code:
1
2
3
while read LINE; do
  # iets
done < /een/file
Hmm ok dat wist ik dus niet :) .
Is idd al stuk eleganter.

Maar kan het toch niet zonder dat je die file op al de code in de while smijt?
Als je bvb. een 'read' wil gebruiken binnen de while (bvb. stuk tonen en wachten tot user op enter drukt), dan kan dat al niet.

Misschien iets met een FIFO of zo?
Ik ben geen held met bash redirecting ...

Zoiets?:
code:
1
2
3
4
5
6
cat FILE > pipe &

while read pipe
do
 <...>
done


Even testen ...

Edit:

Ok zo kan het blijkbaar:
code:
1
2
3
4
5
6
7
8
9
# koppel FILE aan file-descriptor 3
exec 3<> FILE

while read LINE <&3
do
  <...>
done

exec 3>&-


Hoewel, elegant... ?

[ Voor 12% gewijzigd door DieterVDW op 08-10-2008 16:23 ]


  • sparks
  • Registratie: December 2002
  • Laatst online: 08:33
han@linux-3qta:~/tmp> cat a.txt
a b c d
b c d e
c d e f
d e f g
han@linux-3qta:~/tmp> bash b
d c b a
e d c b
f e d c
g f e d
han@linux-3qta:~/tmp> cat b
cat a.txt | while read l
do
set $l
echo $4 $3 $2 $1
done

  • wzzrd
  • Registratie: Februari 2000
  • Laatst online: 17-01 19:39

wzzrd

The guy with the Red Hat

DieterVDW schreef op woensdag 08 oktober 2008 @ 16:04:
Als je bvb. een 'read' wil gebruiken binnen de while (bvb. stuk tonen en wachten tot user op enter drukt), dan kan dat al niet.
Dat kan wel, maar dan gebruik je daarvoor (ook) een fd. Persoonlijk vind ik die while read met die < een stuk eleganter en aanmerkelijk beter leesbaar dan dat ge-emmer met die exec's.

Elegant is ook nogal een subjectief begrip hè. Iets is m.i. elegant als het (a) een simpele oplossing is, met (b) simpele, leesbare code. Die exec's om je while blok heen zetten vallen daar denk ik niet onder ;-)

  • user109731
  • Registratie: Maart 2004
  • Niet online
Ik vind de oplossing van PowerSp00n best netjes. Wil je FILE bovenaan hebben, dan kun je zoiets doen:
code:
1
2
3
4
cat FILE | while read line; 
do
   <doe iets met de ingelezen lijn>
done

Dat lijkt al best veel op jouw pseudocode:
code:
1
2
3
4
for-each LINE from FILE
do
   <doe iets met de ingelezen lijn>
done

[ Voor 61% gewijzigd door user109731 op 08-10-2008 23:08 ]

Pagina: 1