2016-11-28 20 views
0

のためのランダムな名前を作成してIここでmerged_t*.csv完全なスクリプト

と呼ばれる出力ファイルに複数のcsvのファイルを結合するスクリプトは、スクリプトである:最初のコマンド"out_$RANDOM"する必要があります。

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" 2番目の数字が"out_$RANDOM"と同じである必要があります。

どうすればいいですか?

+3

参照[なぜあなたはLS(1)の出力を解析するべきではありません](http://mywiki.wooledge.org/ParsingLs ) – Inian

答えて

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 
0

IPOR Sircerはすでに正しくあなたに答え。解決策は、$RANDOMの値を変数に保存することです。あなたの質問はbug-

を持っていた理由を

あなたが$RANDOMを呼び出すたびに説明するために、乱数を生成ツーなっているまさにありません。したがって、複数回呼び出すと、異なる乱数が生成されます。したがって、それを呼び出すたびに異なる名前が付けられます。しかし、それを一度呼び出すと変数に保存すると、もはや変更することはできません(1回だけ呼び出されたため)。

$RANDOMでも乱数を生成する最良の方法ではありません。これをテストするには、行うことができますfollowing-

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年頃)ほぼ同じであることがわかります。これは、あなたがそれを呼んだ異なる時間に非常に良い変化が観察されていないことを示しています。

より良い方法は、awksrandコマンドを含みます。

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} 
関連する問題