我需要在文件的每一行附加一个UUID(每行新生成的唯一)。我更喜欢使用SED或AWK进行此活动,并利用我的Linux机箱上的UUIDGEN可执行文件。我无法弄清楚如何为每一行生成UUID并附加它。
我试过了:
awk '{print system(uuidgen) $1} myfile.csv
sed -i -- 's/^/$(uuidgen)/g' myfile.csv
许多其他变种无效。这可以用SED或AWK完成,还是应该调查另一个不是基于shell脚本的解决方案?
此致 斯蒂芬。
答案 0 :(得分:4)
使用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
答案 1 :(得分:2)
使用xargs
更简单:
paste -d " " myfile.csv <(xargs -I {} uuidgen {} < myfile.csv)
这会为uuidgen
myfile.csv
答案 2 :(得分:2)
试试这个
awk '{ "uuidgen" |& getline u; print u, $1}' myfile.csv
如果你想要附加而不是前置更改打印顺序。
答案 3 :(得分:2)
只需调整尝试的语法,这样的事情就可以了:
$ 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
例如:
$ 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
正确的解决方案是使用其他shell命令,因为awk并没有为你买任何东西:
{{1}}
答案 4 :(得分:0)
您可以使用paste
和GNU sed
:
paste <(sed 's/.*/uuidgen/e' file) file
这使用GNU执行扩展e
每行生成一个UUID,然后paste
将文本粘贴在一起。使用-d
paste
标志将分隔符从默认选项卡更改为您想要的任何内容。