Search code examples
linuxbashshellawksed

How to generate a UUID for each line in a file using AWK or SED?


I need to append a UUID ( newly generated unique for each line) to each line of a file. I would prefer to use SED or AWK for this activity and take advantage of UUIDGEN executable on my linux box. I cannot figure out how to generate the the UUID for each line and append it.

I have tried:

awk '{print system(uuidgen) $1} myfile.csv
sed -i -- 's/^/$(uuidgen)/g' myfile.csv

And many other variations that didn't work. Can this be done with SED or AWK, or should I be investigating another solution that is not shell script based?

Sincerely, Stephen.


Solution

  • Just tweaking the syntax on your attempt, something like this should work:

    awk '("uuidgen" | getline uuid) > 0 {print uuid, $0} {close("uuidgen")}' myfile.csv
    

    For example:

    $ cat file
    a
    b
    c
    
    $ awk '("uuidgen" | getline uuid) > 0 {print uuid, $0} {close("uuidgen")}' file
    52a75bc9-e632-4258-bbc6-c944ff51727a a
    24c97c41-d0f4-4cc6-b0c9-81b6d89c5b77 b
    76de9987-a60f-4e3b-ba5e-ae976ab53c7b c
    

    The right solution is to use other shell commands though since the awk isn't buying you anything:

    $ xargs -n 1 printf "%s %s\n" $(uuidgen) < file
    763ed28c-453f-47f4-9b1b-b2f972b2cc7d a
    763ed28c-453f-47f4-9b1b-b2f972b2cc7d b
    763ed28c-453f-47f4-9b1b-b2f972b2cc7d c