Umleiten der Druckausgabe in mehrere Dateien in awk

Umleiten der Druckausgabe in mehrere Dateien in awk

Ich möchte dieselben Zeilen in zwei verschiedene Dateien drucken. Was ich gerade mache, ist:

print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file1.txt";
print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file2.txt";

Kann ich einen einzelnen Befehl schreiben, um es auf zwei verschiedene Dateien umzuleiten?

BEARBEITEN

Ich möchte nicht die gesamte Befehlsausgabe in mehrere Dateien drucken, sondern einige Datensätze basierend auf bestimmten Bedingungen in mehrere Dateien schreiben. Ich drucke dies innerhalb eines awkSkripts aus, also brauche ich eineeffizientso geht das.

Antwort1

Mit geht das nicht awk.

Mit teekönnen Sie etwa Folgendes tun:

$ awk '{print ID[i]" "Value[i]" "TS1[i]" "TS2[i]}' file | tee out1 out2

Verwenden Sie es tee -a, wenn Sie vorhandene Dateien anhängen und nicht überschreiben möchten.

Wenn Sie nicht die gesamte Ausgabe drucken möchten, können Sie Folgendes versuchen:

awk '
    BEGIN {outfile["a.txt"];outfile["b.txt"]}
    { for (file in outfile) { print > file } }' file

Antwort2

Innerhalb können Sie awkstatt der Weiterleitung zu einer Datei mit mit print "text" > "file"zu einem Befehl weiterleiten:

print "something" | "tee file1.txt file2.txt"

Wenn Sie dies zum ersten Mal verwenden |, awkwird der Befehl gestartet und beim nächsten Mal wird derselbe Befehl erneut verwendet, sodass nicht teejedes Mal ein neuer Befehl gestartet wird und die Dateien nicht überschrieben werden (Sie müssen dies aufrufen, wenn Sie beim nächsten Mal einen neuen Befehl starten close("tee file1.txt file2.txt")möchten ). Wenn Sie jedoch beides tun , kommt es zu einem Konflikt.awk> "file1.txt"| "tee file1.txt..."

Dann möchten Sie möglicherweise stattdessen >> "file1.txt"und verwenden | "tee -a file1.txt...".

Ich würde jedoch immer noch mit@cuonglms forAnsatzoder verwenden Sie eine awkFunktion, da dies sauberer und effizienter wäre.

Antwort3

Abenutzerdefinierte Funktionkönnte Ihren Code übersichtlicher machen und weniger Duplikate verursachen, falls dies Ihr Anliegen ist.

function print_to_files( message, file_a, file_b ) {
   print message > file_a;
   print message > file_b;
}

message = sprintf( "%s %s %s %s", ID[i], Value[i], TS1[i], TS2[i] )
print_to_files( message , "filea", "fileb" );'

Oder codieren Sie die Dateien fest, wenn das alles ist, was Sie benötigen.

function print_to_files( message ) {
   print message > "/path/to/filea";
   print message > "/path/to/fileb";
}

message = sprintf( "%s %s %s %s", ID[i], Value[i], TS1[i], TS2[i] )
print_to_files( message );'

Antwort4

Sie können dies mit sed- tun, aber ohne eine klarere Vorstellung Ihrer Eingabe weiß ich nicht, wie ich es konkret demonstrieren soll. Hier ist dennoch ein allgemeines Beispiel:

seq 10 | sed -ne '/1/w ./onesfile.txt' -e '/3/w threesfile.txt'

Das schreibt nur die Zeilen, die ein enthalten, 1in das onesfile.txtund sonst in 3- alles andere wird gelöscht. Das ist einsehrgrundlegendes Beispiel, wie es funktionieren könnte, aber wenn Sie Beispieleingaben bereitstellen könnten, könnte ich es vielleicht etwas besser machen.

Sobald sedeine Datei zum Schreiben geöffnet wird, bleibt sie geöffnet, bis der Vorgang abgeschlossen ist – sie kürzt ihre eigenen Schreibvorgänge nicht kontinuierlich ab – die Dateideskriptoren bleiben für die Dauer des Vorgangs erhalten.

verwandte Informationen