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

问题描述 投票:0回答:6

我需要将 UUID(新生成的每行唯一 ID)附加到文件的每一行。我更愿意使用 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
6个回答
5
投票

使用

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

输出文件.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

4
投票

只需调整你的尝试的语法,类似这样的东西应该可以工作:

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

2
投票

试试这个

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

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


2
投票

使用

xargs
在这里更简单:

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

这将为

uuidgen
 的每一行调用 
myfile.csv


0
投票

您可以使用

paste
和 GNU
sed
:

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

这使用 GNU 执行扩展

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


0
投票

这些看起来都很慢。 Ruby 可以快速完成。

ruby -r securerandom -ne 'print SecureRandom.uuid + " " + $_' file
© www.soinside.com 2019 - 2024. All rights reserved.