我有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分钟
答案 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(-
)对应的一对行粘贴在单个输出行上,以,
由于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的转换只进行一次,转换文件所需的时间不会比复制磁盘上的文件长。