Goodreads1 is een social website waar je kan bijhouden welke boeken je gelezen hebt, hoe goed je ze vond, etc2. Je kan ook je eigen data exporteren om ze achteraf te analyseren. In goodreads.tsv3 staat mijn ge-exporteerde file met de boeken tot begin vorig jaar (die ik heb omgezet van een comma separated value bestand naar een tab separated value bestand om het iets eenvoudiger te maken hier).

We kunnen egrep, cut, en andere tekst-operaties gebruiken om dit bestand op een hacky manier te analyseren. (Opmerking! Voor grote, serieuze projecten, gebruik alsjeblieft een serieuze, robuuste CSV-file parser! Eentje die overweg kan met velden waar ook separators in staan, en newlines, etc. In Python kan je hier bijvoorbeeld de csv-module4 voor gebruiken.)

  1. Het head commando kan een configureerbaar aantal lijnen aan het begin van een bestand (of standard input) te printen. Gebruik dit om énkel de eerste regel (die met de hoofding) uit te printen, zodat je weet welke kolom wat bevat. (Zoek op in de man-pages welke opties voor head je hier nodig hebt.)
  2. De echte content bestaat natuurlijk uit alle regels behalve de eerste regel. (Meestal gebruikt men voor headers een lijn die begint met # om aan te geven dat het commentaar is, op zo’n manier dat je die makkelijk met egrep -v kan wegfilteren, maar hier dus niet. Pech!) Het tail commando kan je gebruiken om de laatste regels van een bestand (of standard input) te printen. Gebruik dit om alle lijnen behalve de eerste uit te printen (kijk eens naar de man-page van tail dus).
  3. Print de titels van alle boeken waar in de volledige lijn Gollancz (een uitgeverij) vermeld staat.
  4. Sommige auteurs lees ik blijkbaar meer dan anderen. Print een gesorteerde lijst af van hoe vaak ik elke auteur gelezen heb, met vooraan elke auteur dus het aantal keer dat deze voorkomt in de lijst.
  5. Breid de pipeline uit opgave 4 uit om de naam te printen van de auteur waarvan ik het grootste aantal boeken in de lijst staan heb. (Zonder het aantal boeken van hem/haar er voor. Opgelet: als je hier cut zou gebruiken, weet dan dat de getallen uitgelijnd zijn met spaties, en dat voor cut elke delimiter/spatie voor een nieuw veld zal zorgen. Je kan dus niet zomaar het tweede veld selecteren, dat is immers leeg.)
  6. Veel boeken maken deel uit van een reeks. Die herken je in de titel van het boek, deze hebben de vorm Titel (Reeksnaam, #nummer). Je kan dus de reeks herkennen doordat de boeken een deel bevatten dat tussen haakjes staat, en waarbij dit deel vaak (maar niet altijd!) tussen haakjes een komma heeft na de reeksnaam, gevolgd door een hekje (#) en een suffix dat het nummer (of nummers) uit de reeks voorstelt. Ik wil nu een unieke lijst van alle namen van boekenreeksen in de lijst. Als je bij het filteren met egrep wil filteren op ronde haakjes, dan moet je deze escapen door er een backslash voor te zetten: egrep '\(blabla\)' … zoekt op de letterlijke string (blabla) met haakjes. (Anders is dit namelijk een groepering.) (Unieke lijsten kan je met uniq verkrijgen.)

Ik weet ook dat je hier makkelijk kan valsspelen door de juiste uitvoer gewoon naar het scherm te printen; probeer de uitdaging voor jezelf aan te gaan om hier een echte pijplijn van te maken :)