$30 off During Our Annual Pro Sale. View Details »

Using Awk: An old-school text processing tool with surprising versatility

Using Awk: An old-school text processing tool with surprising versatility

Arjan van der Gaag

August 26, 2015
Tweet

More Decks by Arjan van der Gaag

Other Decks in Programming

Transcript

  1. Using Awk
    An old-school text processing tool with surprising versatility

    View Slide

  2. Postcodes
    ---------
    Het koppelen van postcodes aan verschillende soorten publications (dag en
    weekbladen) gaat via het volgende tabel.
    Wij houden zelf een tabel bij van postcodes met plaatsnamen, gemeentenamen
    en grenzen (voor kaartjes.)
    ### `geospatial_areas`
    | **Veld** | **Type** | **Beschrijving** | **Voorbeeld** |
    |---------------|----------|------------------------------|---------------|
    | `postal_code` | integer | 4 postcode posities | 3775 |
    | `region_id` | string | Regio code (dag of weekblad) | STAP |

    View Slide

  3. COMMENT ON COLUMN geospatial_areas.postal_code IS '4 postcode posities';
    COMMENT ON COLUMN geospatial_areas.region_id IS 'Regio code (dag of
    weekblad)';

    View Slide

  4. Awk processes records with fields
    [CONDITION] { [ACTIONS] }

    View Slide

  5. Awk processes records with fields
    [CONDITION] { [ACTIONS] }
    [CONDITION] { [ACTIONS] }

    View Slide

  6. Awk processes records with fields
    [CONDITION] { [ACTIONS] }
    [CONDITION] { [ACTIONS] }
    BEGIN { [ACTIONS] }
    END { [ACTIONS] }

    View Slide

  7. % awk '{ print }' docs.md

    View Slide

  8. % awk '{ print }' docs.md
    Postcodes
    ---------
    Het koppelen van postcodes aan verschillende soorten
    publications (dag en weekbladen) gaat via het volgende
    tabel.
    Wij houden zelf een tabel bij van postcodes met
    plaatsnamen, gemeentenamen en grenzen (voor kaartjes.)
    ### `geospatial_areas`
    | **Veld** | **Type** | **Beschrijving** |
    **Voorbeeld** |
    |---------------|----------|------------------------------|

    View Slide

  9. % awk '{ print $1 }' docs.md

    View Slide

  10. % awk '{ print $1 }' docs.md
    Postcodes
    ---------
    Het
    Wij
    ###
    |
    |---------------|----------|------------------------------|
    ---------------|
    |
    |

    View Slide

  11. % awk -F '\|' '{ print $1 }' docs.md

    View Slide

  12. % awk -F '\|' '{ print $1 }' docs.md
    Postcodes
    ---------
    Het koppelen van postcodes aan verschillende soorten
    publications (dag en weekbladen) gaat via het volgende
    tabel.
    Wij houden zelf een tabel bij van postcodes met
    plaatsnamen, gemeentenamen en grenzen (voor kaartjes.)
    ### `geospatial_areas`

    View Slide

  13. % awk -F '\|' '{ print $2 }' docs.md

    View Slide

  14. % awk -F '\|' '{ print $2 }' docs.md
    **Veld**
    ---------------
    `postal_code`
    `region_id`

    View Slide

  15. % awk -F '\|' '/\|/ { print $2 }' docs.md

    View Slide

  16. % awk -F '\|' '/\|/ { print $2 }' docs.md
    **Veld**
    ---------------
    `postal_code`
    `region_id`

    View Slide

  17. % awk -F '\|' '/\|/ && !/-|\*/ { print $2 }' docs.md

    View Slide

  18. % awk -F '\|' '/\|/ && !/-|\*/ { print $2 }' docs.md
    `postal_code`
    `region_id`

    View Slide

  19. % awk -F ' *\| *' '/\|/ && !/-|\*/ { print $2 }' docs.md

    View Slide

  20. % awk -F ' *\| *' '/\|/ && !/-|\*/ { print $2 }' docs.md
    `postal_code`
    `region_id`

    View Slide

  21. % awk -F ' *\| *' '/\|/ && !/-|\*/ { print $2, $4 }'
    docs.md

    View Slide

  22. % awk -F ' *\| *' '/\|/ && !/-|\*/ { print $2, $4 }'
    docs.md
    `postal_code` 4 postcode posities
    `region_id` Regio code (dag of weekblad)

    View Slide

  23. #!/usr/bin/awk -f
    BEGIN { FS = " *\| *" }
    /\|/ && !/-|\*/ {
    print $2, $4
    }
    `postal_code` 4 postcode posities
    `region_id` Regio code (dag of weekblad)

    View Slide

  24. #!/usr/bin/awk -f
    BEGIN { FS = " *\| *" }
    /\|/ && !/-|\*/ && $4 != "" {
    print $2, $4
    }
    `postal_code` 4 postcode posities
    `region_id` Regio code (dag of weekblad)

    View Slide

  25. #!/usr/bin/awk -f
    BEGIN { FS = " *\| *" }
    { gsub("`", "") }
    /\|/ && !/-|\*/ && $4 != "" {
    print $2, $4
    }
    postal_code 4 postcode posities
    region_id Regio code (dag of weekblad)

    View Slide

  26. #!/usr/bin/awk -f
    BEGIN { FS = " *\| *" }
    { gsub("`", "") }
    /\|/ && !/-|\*/ && $4 != "" {
    printf "COMMENT ON COLUMN t.%s IS '%s';\n", $2, $4
    }
    COMMENT ON COLUMN t.postal_code IS '4 postcode posities';
    COMMENT ON COLUMN t.region_id IS 'Regio code (dag of
    weekblad)';

    View Slide

  27. % awk '{ print }' docs.md
    Postcodes
    ---------
    Het koppelen van postcodes aan verschillende soorten
    publications (dag en weekbladen) gaat via het volgende
    tabel.
    Wij houden zelf een tabel bij van postcodes met
    plaatsnamen, gemeentenamen en grenzen (voor kaartjes.)
    ### `geospatial_areas`
    | **Veld** | **Type** | **Beschrijving** |
    **Voorbeeld** |
    |---------------|----------|------------------------------|

    View Slide

  28. #!/usr/bin/awk -f
    BEGIN { FS = " *\| *" }
    { gsub("`", "") }
    /^### / { split($0, a, " ") }
    /\|/ && !/-|\*/ && $4 != "" {
    printf "COMMENT ON COLUMN %s.%s IS '%s';\n", a[2], $2, $4
    }

    View Slide

  29. #!/usr/bin/awk -f
    BEGIN { FS = " *\| *" }
    { gsub("`", "") }
    /^### / { split($0, a, " ") }
    /\|/ && !/-|\*/ && $4 != "" {
    printf "COMMENT ON COLUMN %s.%s IS '%s';\n", a[2], $2, $4
    }
    COMMENT ON COLUMN geospatial_areas.postal_code IS '4
    postcode posities';
    COMMENT ON COLUMN geospatial_areas.region_id IS 'Regio code
    (dag of weekblad)';

    View Slide

  30. ruby -F' *\| *' -a -l -n -e '$table = $_.split(" ")[1] if /
    ^### /; next if !/\|/ || /-|\*/; print gsub('`', '', format
    "COMMENT ON COLUMN %s.%s IS %s;\n", $table, $F[1], $F[3])'
    docs.md

    View Slide

  31. #!/usr/bin/env ruby -F' *\| *' -a -l -n
    table = $_.split(" ")[1] if /^### /
    next if !/\|/ || /-|\*/ || $F[3] == ""
    print gsub('`', '',
    format(
    "COMMENT ON COLUMN %s.%s IS %s;\n",
    $table,
    $F[1],
    $F[3]
    )
    )

    View Slide