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