Führen Sie awk für jede mit find gefundene Datei aus und leiten Sie das Ergebnis in einen neuen Dateinamen um

7

Ich versuche, die Ergebnisse von find zu übernehmen und dann awk auszuführen, um die ersten beiden Spalten zu drucken. Dann möchte ich diese Ergebnisse für jede Datei in einen neuen Dateinamen umleiten, wobei ich den vorhandenen Dateinamen mit einem zusätzlichen Suffix zum Namen von umführe. Dateien im Verzeichnis mit der ursprünglichen Quelle als file.txt und den neuen Dateien mit dem Namen file-new.txt

Zum Beispiel:

find -type f -iname "*.txt" -exec awk '{print $1, $2}' {} \;

Was muss ich dazu hinzufügen? Wäre die Verwendung von sed eine bessere Wahl?

Zedexodus
quelle

Antworten:

8

Die einfachste Methode ist die Verwendung der Ausgabeumleitung von awk. Die Umleitung der Awk-Ausgabe ist in einfachen Fällen sehr einfach zu verwenden: Die Datei wird bei der ersten Verwendung einer Umleitung geöffnet, und nachfolgende Umleitungen auf denselben Dateinamen verwenden den vorhandenen Dateideskriptor.

Wenn Sie dem Dateinamen ein Suffix hinzufügen möchten, ist dies so einfach wie

find -type f -iname "*.txt" -exec awk '{print $1, $2 >(FILENAME "-new")}' {} +

Sie können den Dateinamen jedoch komplexer umwandeln (hier nur in der ersten Zeile jeder Eingabedatei neu berechnet):

find -type f -iname "*.txt" -exec awk '
    FNR==1 {out=FILENAME; sub(/\.[^.]*$/, "-new&", out) || out = out "-new"}
    {print $1, $2 >out}
' {} +
Gilles 'SO - hör auf böse zu sein'
quelle