将日期时间附加到600万行文件中每行的末尾

时间:2017-06-05 15:42:20

标签: awk sed bigdata

我有6.8亿行(19gig)文件,我需要在每一行上附加日期时间。我每晚都得到这个文件,我必须将处理它的时间添加到每行的末尾。我尝试了很多方法,包括sed / awk并将其加载到SQL数据库中,最后一列默认为当前时间戳。

我想知道是否有快速的方法来做到这一点?到目前为止,我最快的方法需要两个小时,考虑到此文件中信息的紧迫性,这个方法还不够快。这是一个平面的CSV文件。

EDIT1:

这是我到目前为止所做的:

awk -v date="$(date +"%Y-%m-%d %r")" '{ print $0","date}' lrn.ae.txt > testoutput.txt

时间= 117分钟

perl -ne 'chomp; printf "%s.pdf\n", $_' EXPORT.txt > testoutput.txt

时间= 135分钟

mysql load data local infile '/tmp/input.txt' into table testoutput

时间= 211分钟

4 个答案:

答案 0 :(得分:4)

您没有指定每个行的时间戳是否必须不同。 “开始处理”时间是否足够?

如果是这样,一个简单的解决方案是使用paste命令,预先生成的时间戳文件,与您正在处理的文件的长度完全相同。然后只是paste整个事情。此外,如果整个过程受I / O约束,正如其他人所推测的那样,那么在带有SSD驱动器的盒子上运行它可能会有助于加快这个过程。

我刚刚在600万行文件(约占你自己的1%)上进行了本地试用,实际上它可以在不到一秒的时间内在Macbook Pro上使用SSD驱动器进行。

 ~> date; time paste file1.txt timestamps.txt > final.txt; date
 Mon Jun  5 10:57:49 MDT 2017

 real   0m0.944s
 user   0m0.680s
 sys    0m0.222s
 Mon Jun  5 10:57:49 MDT 2017

我现在要尝试一个~5亿行文件,看看票价是多少。

更新:

好的,结果是。与您的解决方案相比,粘贴速度非常快,整个过程总共需要超过90秒,600M行的简单数据。

~> wc -l huge.txt 
600000000 huge.txt
~> wc -l hugetimestamps.txt 
600000000 hugetimestamps.txt
~> date; time paste huge.txt hugetimestamps.txt > final.txt; date
Mon Jun  5 11:09:11 MDT 2017

real    1m35.652s
user    1m8.352s
sys 0m22.643s
Mon Jun  5 11:10:47 MDT 2017

您仍需要提前准备时间戳文件,但这是一个简单的bash循环。我在不到一分钟的时间里创造了我的。

答案 1 :(得分:3)

简化mjuarez' helpful approach的解决方案:

yes "$(date +"%Y-%m-%d %r")" | paste -d',' file - | head -n "$(wc -l < file)" > out-file

请注意,与链接答案中的方法一样,您必须事先知道输入行的数量 - 这里我使用wc -l来计算它们,但是如果数字是固定的,只需使用固定数字。

  • yes无限期地重复其参数,每个参数都在其自己的输出行上,直到它被终止。

  • paste -d',' file -file和stdin(-)对应的一对行粘贴在单个输出行上,以,

    <分隔/ LI>
  • 由于yes产生了无尽的&#34;输出head -n "$(wc -l < file)"确保处理完所有输入行后处理停止。

管道的使用充当了内存限制,因此内存耗尽不应该成为一个问题。

答案 2 :(得分:2)

另一种测试方法是

$ date +"%Y-%m-%d %r" > timestamp
$ join -t, -j9999 file timestamp | cut -d, -f2-

或时间戳也可以生成<(date +"%Y-%m-%d %r")

join使用不存在的字段(9999)创建第一个文件和第二个文件的叉积,并且因为第二个文件只有一行,所以实际上将它附加到第一个文件。需要cut来删除join

生成的空键字段

答案 3 :(得分:0)

如果要为文件中的每一行添加相同(当前)的日期时间,您可以将文件保留原样,并将日期时间放在文件名中。根据以后的用途,处理文件的软件可以先从文件名中获取日期时间。

要将相同的日期时间放在每行的末尾,可以编写一些简单的代码:

  • 创建一个包含分隔符和日期时间的字符串。
  • 从文件中读取行,追加上面的字符串并写回新文件。

这样,从datetime到string的转换只进行一次,转换文件所需的时间不会比复制磁盘上的文件长。