繁体   English   中英

如何使用AWK或SED为文件中的每一行生成UUID?

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

我需要将UUID(每行新生成的唯一值)附加到文件的每一行。 我更愿意使用SED或AWK进行此活动,并在我的Linux机器上利用UUIDGEN可执行文件。 我无法弄清楚如何为每行生成UUID并将其附加。

我努力了:

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

还有许多其他无效的变体。 可以使用SED或AWK来完成此操作,还是应该研究另一个不基于Shell脚本的解决方案?

真诚的斯蒂芬。

使用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

myfile.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

在这里使用xargs更简单:

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

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

尝试这个

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

如果要添加而不是添加,请更改打印顺序。

只是在尝试时调整语法,类似的东西应该可以工作:

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

您可以使用paste和GNU sed

paste <(sed 's/.*/uuidgen/e' file) file

这使用GNU execute扩展e生成每行一个UUID,然后paste将文本paste回去。 使用-d paste标志可以将分隔符从默认选项卡更改为所需的分隔符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM