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

时间:2017-08-03 16:37:34

标签: linux bash shell sed

我需要为文本文件中的每一行添加一个随机guid。我需要为每一行提供不同的指导。

除了guid对于每一行都相同之外,这是有效的:

sed -e "s/$/$(uuidgen -r)/" text1.log > text2.log

3 个答案:

答案 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秒钟。