2016-11-28 3 views
0

Ich habe ein Skript, die merged_t*.csvErstellen Sie einen beliebigen Namen für das gesamte Skript

Hier ist das Skript namens mehr csv-Dateien in eine Ausgabedatei verbindet:

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 

Die "$RANDOM" im ersten Befehl "out_$RANDOM" Muss sei das gleiche, dass die "out_$RANDOM" in der zweiten.

Wie kann ich es tun?

+3

See [Warum Sie die Ausgabe von ls nicht analysieren sollte (1)] (http://mywiki.wooledge.org/ParsingLs) – Inian

Antwort

1

erklären Ihre eigene Variable zuerst:

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 beantwortet Sie bereits richtig. Die Lösung besteht darin, den Wert $RANDOM in einer Variablen zu speichern.

Um zu erklären, warum Ihre Frage

Jedes Mal wenn ein Bug- hatte man $RANDOM nennen, es tut genau das, was es eine Zufallszahl to- erzeugen soll. Also, wenn Sie es mehrmals aufrufen, wird es verschiedene Zufallszahlen generieren. Also wird jeder Aufruf einen anderen Namen ergeben. Wenn Sie es jedoch einmal aufrufen und in einer Variablen speichern, kann es nicht mehr geändert werden (da es nur einmal aufgerufen wurde).

$RANDOM ist nicht der beste Weg, um Zufallszahlen zu generieren. Um dies zu testen, können Sie die folgenden- tun

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

Was dieses kleine Skript tut, ist tausend $ RANDOM Ausgänge (innere Schleife) erzeugen und dann den Durchschnitt der 1000-Nummern. Dies geschieht in diesem Beispiel 500 mal (äußere Schleife). Sie werden sehen, dass die Durchschnittswerte über tausend Iterationen von $RANDOM einander sehr ähnlich sind (um 16000 herum). Dies zeigt, dass in den verschiedenen Zeiten, in denen Sie es nennen, keine sehr gute Variation beobachtet wird.

Bessere Möglichkeiten sind der Befehl awksrand.

1

Verwendung der Befehl, der bereits Ihr Problem lösen: 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} 
Verwandte Themen