Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中生成包含随机内容的大型csv_Bash_Unix_Csv - Fatal编程技术网

在bash中生成包含随机内容的大型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 )

我试图在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 )
  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
。今天刚刚使用了这个,非常好