Skip to content

Instantly share code, notes, and snippets.

@treatmesubj
Last active July 9, 2024 21:24
Show Gist options
  • Save treatmesubj/2e5194377000b56e9f88416fb31bac76 to your computer and use it in GitHub Desktop.
Save treatmesubj/2e5194377000b56e9f88416fb31bac76 to your computer and use it in GitHub Desktop.
CSV Column REGEX Filter REPL

See also: Show HN: Turn your fzf into a live REPL (paweldu.dev)

demo

#!/usr/bin/env bash

csv_filter() {
    # cludesym='!~' csv_filter <file|stdin>
    local cludesym=${cludesym:-'~'}
    local data=${1:-'-'}
    if [ "$data" = "-" ]; then
        local data=$(mktemp)
        cp /dev/stdin $data
    fi
    headers=$(head -1 < $data | csvquote)
    colname=$(
        echo $headers \
        | awk -v RS=',' '{print NR, $0}' \
        | grep . \
        | fzf --preview-window='down:80%' --preview "batcat --language 'csv' \
        --color=always --line-range=:50 $data"
    )
    colnum=$(echo $colname | cut -d ' ' -f 1)
    reggie=$(
        csvquote < $data \
        | awk -v colnum=$colnum -F, '!seen[$colnum]++ { print $colnum }' \
        | fzf --print-query --disabled --preview-window='down:80%' --preview \
        "csvquote < $data \
        | awk -v colnum=$colnum -v reggie={q} -F, \
        '{ if (NR==1) { print \$0 } else if (\$colnum $cludesym reggie) { print \$0 } }' \
        | batcat --language 'csv' --color=always" | head -1
    )
    csvquote < $data \
    | awk -v colnum=$colnum -v reggie=$reggie -F, \
    '{ if (NR==1) { print $0 } else if ($colnum '$cludesym' reggie) { print $0 } }'
}
alias csv-filter=csv_filter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment