【问题标题】:How to generate a UUID for each line in a file using AWK or SED?如何使用 AWK 或 SED 为文件中的每一行生成 UUID?
【发布时间】:2018-08-17 04:02:52
【问题描述】:

我需要将一个 UUID(每行新生成的唯一)附加到文件的每一行。我更喜欢使用 SED 或 AWK 进行此活动,并利用我的 linux 机器上的 UUIDGEN 可执行文件。我不知道如何为每一行生成 UUID 并附加它。

我试过了:

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

还有许多其他不起作用的变体。这可以通过 SED 或 AWK 完成,还是我应该研究另一种不基于 shell 脚本的解决方案?

真诚地, 斯蒂芬。

【问题讨论】:

    标签: linux bash shell awk sed


    【解决方案1】:

    使用bash,这将创建一个带有连接uuid的文件outfile.txt:

    注意:请运行 which bash 以验证您的系统上的 bash 副本的位置。它可能与以下脚本中使用的位置不同。

    #!/usr/local/bin/bash
    
    while IFS= read -r line
    do
        uuid=$(uuidgen)
        echo "$line $uuid" >> outfile.txt
    done < myfile.txt
    

    我的文件.txt:

    john,doe
    mary,jane
    albert,ellis
    bob,glob
    fig,newton
    

    outfile.txt

    john,doe 46fb31a2-6bc5-4303-9783-85844a4a6583
    mary,jane a14bb565-eea0-47cd-a999-90f84cc8e1e5
    albert,ellis cfab6e8b-00e7-420b-8fe9-f7655801c91c
    bob,glob 63a32fd1-3092-4a72-8c24-7b01c400820c
    fig,newton 63d38ad9-5553-46a4-9f24-2e19035cc40d
    

    【讨论】:

    • 你好@Cyrus - 我想听从你的建议,但我没有看到任何编辑问题。请提前告知和感谢。
    • 我建议用文字替换两张图片。
    • 也许还应该对#!/usr/local/bin/bash 中的非标准解释器位置发表评论。您会对逐字复制...的数字感到惊讶
    • 我尝试将图像更改为文本,但似乎已经完成,没问题。我尝试添加关于bash 位置的注释,但目前我无法编辑答案。感谢所有的建议和帮助。
    • @Ed Morton 您提到的有趣文章。我更喜欢使用 Perl 来解决这个问题,但 OP 在标签中提到了 bashshelllinux,所以我采用了这种方法。感谢您的反馈 - 我将您的建议纳入我的回答中。
    【解决方案2】:

    只需调整您尝试的语法,这样的事情应该可以工作:

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

    例如:

    $ 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
    

    正确的解决方案是使用其他 shell 命令,因为 awk 并没有给你买任何东西:

    $ 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
    

    【讨论】:

      【解决方案3】:

      试试这个

      awk '{ "uuidgen" |& getline u; print u, $1}' myfile.csv
      

      如果您想追加而不是前置,请更改打印顺序。

      【讨论】:

      • 您不需要特定于 gawk 的 |&amp;,因为它不是协同进程,但您确实需要测试调用的结果并且之后确实需要关闭它。见awk.freeshell.org/AllAboutGetline
      • 是的。如果你不关闭,那么第一个返回的 uuid 将用于每一行。 awk'{“uuidgen”|得到你;关闭(“uuidgen”);打印你,$1}' myfile.csv
      • 此解决方案对所有行使用相同的 UUID
      【解决方案4】:

      在这里使用xargs 更简单:

      paste -d " " myfile.csv <(xargs -I {} uuidgen {} < myfile.csv)
      

      这将为myfile.csv 的每一行调用uuidgen

      【讨论】:

      • 我建议这样做以避免行中的空格问题:xargs -I {} uuidgen {} &lt; myfile.csv | paste -d " " myfile.csv -
      • myfile.csv 中的空格会创建额外的行。
      • 糟糕,我没有意识到 OP 想要追加 uuidgen 输出
      • 由于uuidgen 无论如何都会忽略所有参数,我建议改用xargs -L1
      【解决方案5】:

      您可以使用paste 和GNU sed

      paste &lt;(sed 's/.*/uuidgen/e' file) file

      这使用 GNU 执行扩展 e 为每行生成一个 UUID,然后 paste 将文本粘贴在一起。使用 -d paste 标志将分隔符从默认选项卡更改为您想要的任何内容。

      【讨论】:

        猜你喜欢
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多