我需要为大文本文件中的每一行添加一个随机guid。我需要为每一行提供不同的指导。
除了guid对于每一行都相同之外,这是有效的:
sed -e "s/$/$(uuidgen -r)/" text1.log > text2.log
答案 0 :(得分:2)
以下是使用awk
:
awk -v cmd='uuidgen' 'NF{cmd | getline u; print $0, u > "test2.log"; close(cmd)}' test1.log
NF
(或NF > 0
)确保我们仅对非空行执行此操作。close(cmd)
,因此每条记录都会有uuidgen
的新号召。但是,由于每个非空行都会调用uuidgen
,因此对于大型文件来说可能会很慢。
答案 1 :(得分:1)
这是因为在命令开始之前,命令替换将被评估。
shell将首先执行uuidgen -r
,并替换命令替换为它的结果,假设 0e4e5a48-82d1-43ea-94b6-c5de7573bdf8 。然后shell将执行sed
,如下所示:
sed -e "s/$/0e4e5a48-82d1-43ea-94b6-c5de7573bdf8/" text1.log > text2.log
您可以在shell中使用 while 循环来实现目标:
while read -r line ; do
echo "$line $(uuidgen -r)"
done < file > file_out
答案 2 :(得分:1)
我没有为每一行运行全新的uuidgen
进程,而是为 Perl 中的每一行生成了一个新的UUID,这只是一个函数调用:
#!/usr/bin/perl
use strict;
use warnings;
use UUID::Tiny ':std';
my $filename = 'data.txt';
open(my $fh,'<',$filename)
or die "Could not open file '$filename' $!";
while (my $row = <$fh>) {
chomp $row;
my $uuid = create_uuid(UUID_V4);
my $str = uuid_to_string($uuid);
print "$row $str\n";
}
为了测试,我生成了1,000,000行CSV,如here所示。
将UUID添加到我的iMac上的1,000,000记录文件的每一行的末尾需要10秒钟。