簡體   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