Tips en Trucs 2020

Paste

Met de paste terminal opdracht kan je tekstbestanden samenvoegen.

Kolommen

Als voorbereiding maken we een map aan met enkele bestanden:

dany@pindabook:~> mkdir test
dany@pindabook:~> cd test
dany@pindabook:~/test> printf "%s\n" {a..e} | tee letters
a
b
c
d
e
dany@pindabook:~/test> printf "%s\n" {1..5} | tee cijfers
1
2
3
4
5

We kunnen het bestand letters en cijfers samenvoegen met:

dany@pindabook:~/test> paste cijfers letters
1 a
2 b
3 c
4 d
5 e

Hoewel je dit op het scherm niet kunt zien zijn de gegevens gescheiden door Tab-tekens. Met de sed opdracht kunnen we onzichtbare tekens toch weergeven:

dany@pindabook:~/test> paste cijfers letters | sed -n l
1\ta$
2\tb$
3\tc$
4\td$
5\te$

Nu wordt een Tab-teken door \t en een nieuwe regel door $ voorgesteld. Vanzelfsprekend kunnen meerdere bestanden tegelijk samengevoegd worden:

dany@pindabook:~/test> paste cijfers letters cijfers
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5

De volgorde van de bestandsnamen bepaald daarbij de kolomvolgorde.

Scheidingsteken

In bestanden met gegevens, worden deze heel vaak gescheiden door komma's of puntkomma's (CSV bestanden). Met de -d (--delimiters) optie kan je zelf het scheidingsteken vastleggen.

dany@pindabook:~/test> paste -d ';' cijfers letters
1;a
2;b
3;c
4;d
5;e

Serieel

Bij bovenstaande voorbeelden werden alle bestanden parallel gelezen, waardoor deze regel per regel in de uitvoer verschijnen. Met de -s (--serial) optie worden de bestanden na elkaar gelezen, waardoor in de uitvoer elk bestand in één regel terecht komt:

dany@pindabook:~/test> paste -s cijfers letters
1 2 3 4 5
a b c d e

Standaard invoer

Standaard invoer wordt gebruikt als gegevens afkomstig zijn van andere opdrachten.

dany@pindabook:~/test> head -3 cijfers | paste -
1
2
3

De head opdracht geeft enkel de eerste drie regels door aan de paste opdracht. Het - teken zorgt ervoor dat paste geen bestand opent maar de uitvoer van de head opdracht verwerkt. Dit lijkt misschien gek, maar heeft wel degelijk toepassingen. Zo zal elk - teken als een afzonderlijk invoerkanaal beschouwd worden. Zo kan je de inhoud van één bestand of uitvoer van een opdracht in kolommen weergeven:

dany@pindabook:~/test> seq 9 | paste - - -
1 2 3
4 5 6
7 8 9

En verder

Dit zijn nog maar standaard voorbeelden, de paste opdracht is sterk in het samenvoegen van tekstbestanden. Jouw vindingrijkheid en de wetenschap dat de paste opdracht voor je klaar staat, kan helpen bij het oplossen van complexe gegevenstaken. Om verrassingen te voorkomen, controleer je best de uitvoer bij mogelijke probleemsituaties zoals ontbrekende gegevens, enz. De tegenhanger van paste is cut, een opdracht om bestanden te splitsen.

Raadpleeg voor meer info de man pagina met:

dany@pindabook:~/test> man paste
Man: alle passende pagina's vinden, niet alleen eerste (set MAN_POSIXLY_CORRECT to avoid this)
 * paste (1)
   paste (1p)
Man: Welke man-pagina wilt u zien?
Man:
man paste

Ruim op met de volgende opdrachten:

dany@pindabook:~/test> cd
dany@pindabook:~> rm -r test