[英]Append output of a command to each line in large file
我需要在大型文本文件的每一行中添加随机引导。 我需要每个行的GUID都不同。
除了每行的GUID是相同的以外,这行得通:
sed -e "s/$/$(uuidgen -r)/" text1.log > text2.log
这是使用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
,因此对于大文件来说可能会很慢。
这是因为命令替代将在启动命令之前进行评估。
外壳程序将首先执行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
我没有为每一行运行一个全新的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如图所示这里 。
将UUID添加到iMac上1,000,000个记录文件的每一行的末尾需要10秒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.