在bash中生成包含随机内容的大型csv
我试图在bash中生成一个包含随机内容的大型csv。我的机器有6个内核和12G ram,但我的脚本(见下文)只需要140秒就可以处理3列10k行。有没有办法优化这个脚本 用其他语言生成随机csv文件是否有更快的方法在bash中生成包含随机内容的大型csv,bash,unix,csv,Bash,Unix,Csv,我试图在bash中生成一个包含随机内容的大型csv。我的机器有6个内核和12G ram,但我的脚本(见下文)只需要140秒就可以处理3列10k行。有没有办法优化这个脚本 用其他语言生成随机csv文件是否有更快的方法 #!/bin/bash csv="foo\tbar\tbaz" start=$(date) for i in `seq 1 $1` do rand=$(($i * $RANDOM)) str0="$$"$i str1=$( echo "$str0" | md5sum )
#!/bin/bash
csv="foo\tbar\tbaz"
start=$(date)
for i in `seq 1 $1`
do rand=$(($i * $RANDOM))
str0="$$"$i
str1=$( echo "$str0" | md5sum )
randstring1="${str1:2:8}"
randstring2="${str1:0:2}"
csv="$csv\n$randstring1\t$randstring2\t$rand"
done
end=$(date)
datediff=$(( $(date -d "$end" +%s) - $(date -d "$start" +%s)))
echo -e $csv > my_csv.csv
echo "script took $datediff seconds for $(wc -l my_csv.csv) lines"
要相当精确地替换此脚本(按格式),可以使用
hexdump -v -e '5/1 "%02x""\n"' /dev/urandom |
awk -v OFS='\t' '
NR == 1 { print "foo", "bar", "baz" }
{ print substr($0, 1, 8), substr($0, 9, 2), int(NR * 32768 * rand()) }' |
head -n "$1" > my_csv.csv
这分为三个部分:
hexdump -v -e '5/1 "%02x""\n"' /dev/urandom
从五个字节的/dev/uradom
序列中提取,然后将其格式化为十六进制字符串
awk -v OFS='\t' '
NR == 1 { print "foo", "bar", "baz" }
{ print substr($0, 1, 8), substr($0, 9, 2), int(NR * 32768 * rand()) }'
在添加相当于$($i*$RANDOM))
和标题行的字段时,适当设置行的格式,以及
head -n "$1"
获取此文件的第一行$1
。当head
退出时,到awk的管道关闭,awk
退出,到hextump
的管道关闭,hextump
退出,因此整个过程在正确的时间结束
在我的机器(Haswell i5)上,运行这个程序需要0.83秒才能完成100万行。在编译语言中显然要快得多。至少,您应该尽量减少与外部工具的通话次数。我不确定性能影响,但您也可以在循环中执行
echo“$randstring1\t$randstring2\t$rand”
,并将其重定向到输出文件,如done>my_csv.csv
有一个您可能感兴趣的API。您可以显示3-4行输出吗?也请查看这里。。。生成1000000行需要0.6秒。@MarkSetchell:foo-bar baz 7c36ba55 53 24062 e175d0a8 ec 43464 c8b88c21 35 96759 01e90926 4b 18820 082c39f7 0d 107945等等……太棒了。我的机器需要约2秒才能完成100万条生产线。。。。只有一个问题:为什么int(NR***65536***rand())
?awk的rand()
函数返回的值介于0和1之间,而bash的$RANDOM
返回的值介于…0和32768之间,请仔细想想。所以应该是32768而不是65536,我会马上修复它NR
是当前行的编号,因此它类似于您的i
。今天刚刚使用了这个,非常好