为完整脚本创建随机名称

时间:2016-11-28 12:19:27

标签: bash shell

我有一个脚本将几个csv文件连接到名为merged_t*.csv

的输出文件中

这是脚本:

for i in $(ls -latr sample_*.csv); 
do  
    paste -d, $i >> out_$RANDOM.csv;
done

sed 's/^|$/\x27/g' out_$RANDOM.csv | paste -d, > merged_t$RANDOM.csv

第一个命令"$RANDOM"中的"out_$RANDOM"必须与第二个"out_$RANDOM"中的 val conf = new SparkConf() .setMaster("local[8]") .setAppName("Name") val sc = new SparkContext(conf) val sqlContext = new SQLContext(sc) val customSchema = StructType(Array( StructField("date", DateType, true), StructField("time",StringType, true), StructField("am", DoubleType, true), StructField("hum", DoubleType, true), StructField("temp", DoubleType, true) )) val df = sqlContext.read .format("org.apache.spark.sql.execution.datasources.csv.CSVFileFormat") .option("header","true") .option("delimiter",";") .schema(customSchema) .load("data.csv") 相同。

我该怎么办?

3 个答案:

答案 0 :(得分:1)

首先声明自己的变量:

myrandom=$RANDOM
for i in $(ls -latr sample_*.csv); do
    paste -d, $i >> out_${myrandom}.csv;
done
sed 's/^|$/\x27/g' out_${myrandom}.csv | paste -d, > merged_t${myrandom}.csv

答案 1 :(得分:1)

使用已解决问题的命令: mktemp

csv=$(mktemp out_XXXXXXXXXX.csv) 
for i in $(ls -latr sample_*.csv); 
do  
    paste -d, $i >> ${csv};
done

sed 's/^|$/\x27/g' ${csv} | paste -d, > merged_t${csv}

答案 2 :(得分:0)

Ipor Sircer已经正确回答你了。解决方案是将$RANDOM的值保存到变量中。

解释为什么你的问题有错误 -

每次调用$RANDOM时,它都会完全按照自己的意思生成一个随机数。因此,如果您多次调用它,它将生成不同的随机数。因此,每次调用它都会产生不同的名称。但是,当你调用它一次并将其保存在变量中时,它就不能再改变了(因为它只被称为一次)。

$RANDOM不是生成随机数的最佳方法。要对此进行测试,您可以执行以下操作 -

for j in {1..500} 
do 
    for i in {1..1000} 
    do 
        echo "$RANDOM"
   done | awk '{a+=$1} END {print a/NR}' 
done 

这个小脚本的作用是生成一千个$ RANDOM输出(内循环),然后取1000个数字的平均值。在这个例子中它执行了500次(外部循环)。您将看到$RANDOM的任何一千次迭代的平均值彼此非常相似(均为16000左右)。这表明在您调用它的不同时间内没有观察到非常好的变化。

更好的方式包括awk srand命令。