2016-11-29 2 views
-2

ich mit ~ 800.000 E-Mail eine .txt-Datei, die wie folgt aussieht:eine TXT-Datei Shuffle zufällig

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
. 
. 
. 

Mein Ziel ist es, diese Datei zu ändern, damit es so aussieht:

[email protected], [email protected], [email protected], [email protected] 
[email protected], [email protected] 
[email protected], [email protected] 
[email protected], [email protected], [email protected] 
[email protected], [email protected] 
[email protected], [email protected] 
[email protected], [email protected], [email protected] 
. 
. 
. 

Was ich will ist eine zufällige Anzahl von E-Mails pro Zeile, getrennt durch Kommas oder Leerzeichen. Ich wollte eigentlich kein Programm schreiben, da ich gehört habe, dass es möglich ist, bestimmte Shell-Befehle für diese Art von Arbeit zu verwenden. Ist das möglich und wenn ja, wie würde ich das erreichen?

+0

Jede Zeile der Datei entspricht einer anderen Benutzerliste von Freunden. Jede Person hat eine zufällige Anzahl von Freunden. –

+0

Warum also nicht 3 oder 4 E-Mails pro Zeile? – anubhava

+0

Ich denke, ich könnte das tun, aber wäre es nicht seltsam (vom realen Leben), dass jeder einzelne dieser Leute genau 4 Freunde hat? Zum Beispiel kann ich 4 Freunde haben, aber Bob kann 10 Freunde haben. –

Antwort

1

Wenn Sie nichts dagegen nicht awk verwenden, hier ist eine Möglichkeit, es zu tun:

awk 'BEGIN { srand(); } { printf $0; for (i = 0; i <= int(3 * rand()); i++) { if (getline) printf ", " $0; } print ""; }' < input.txt 

Der awk-Skript Teil schön gedruckt und kommentiert:

BEGIN { 
    # initialize random seed 
    srand(); 
} 
{ 
    # print the next line, with terminating newline character 
    printf $0; 

    # loop 1 to 3 times 
    for (i = 0; i <= int(3 * rand()); i++) { 
    # if we can successfully read one more line 
    if (getline) { 
     # print a comma and the next line 
     printf ", " $0; 
    } 
    } 

    # print a newline character to complete the line 
    print ""; 
} 
+0

Ich glaube nicht, dass dies die Antwort auf die Frage ist. Er möchte unbedingt die E-Mails wiederholen lassen - eine einzelne Person kann vielen Menschen ein Freund sein. Auch im Beispiel werden die E-Mails wiederholt. Ihr Skript teilt die Datei in Gruppen von beliebig vielen E-Mails auf (2 bis 4 E-Mails). Aber wie auch immer ... es ist akzeptiert, vielleicht irre ich mich;). – arturro

+0

Der Text sagt nichts über das Wiederholen. Ich sehe in der Beispielausgabe, aber das könnte nur ein schlampig geschriebenes Beispiel sein. – janos

1

die E-Mails in eine Bash-Array lesen ; Schleife durch das Array und drucken Sie jedes Element, nach dem Zufallsprinzip zu einem Newline eingeben:

+0

Wenn Sie möchten, dass einige E-Mails in verschiedenen Zeilen angezeigt werden, sollten Sie zuerst die Datei vorverarbeiten und Adressen mit $ ((RANDOM% 5)) duplizieren. Oder: E-Mails zweimal lesen und zusätzliche Adressen aus dem zweiten Array mit zufälligen Indizes hinzufügen. –

+0

Ahhh, guter Punkt - Ich habe die Idee verpasst, dass das OP wollte, dass einige E-Mails dupliziert werden; Meine aktuelle Lösung mischt die Adressen in Klumpen, zeigt sie aber nur einmal an. –