繁体   English   中英

将命令输出附加到大文件的每一行

[英]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.

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