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 awk
Skripts aus, also brauche ich eineeffizientso geht das.
Antwort1
Mit geht das nicht awk
.
Mit tee
kö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 awk
statt 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 |
, awk
wird der Befehl gestartet und beim nächsten Mal wird derselbe Befehl erneut verwendet, sodass nicht tee
jedes 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 for
Ansatzoder verwenden Sie eine awk
Funktion, 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, 1
in das onesfile.txt
und 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 sed
eine 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.