Warum ersetzt awk sub meine Eingabe nicht?

424
Przemek Hugh Kaznowski

Ich habe Schwierigkeiten gehabt, ein awk-Programm zu schreiben, das Eingabedateien verwendet und den ursprünglichen und durch Leerzeichen getrennten Dateinamen nur in der zweiten Spalte anzeigt. Warum funktioniert der folgende Befehl nicht dafür?

echo -e "abc/123\ndef/456" | awk ''

Für die Aufzeichnung die obigen Ausgaben

mv abc/123 abc/123 mv def/456 def/456 
0
bash ist dazu in der Lage, das alleine zu tun. warum brauchst du awk? Ignacio Vazquez-Abrams vor 5 Jahren 0
Tunnel Vision, ich werde mit der bash-Lösung aktualisieren, danke! Przemek Hugh Kaznowski vor 5 Jahren 0
Welchen Output möchten Sie erreichen? Diese sub () - Funktion entfernt das erste Zeichen der Zeichenfolge. Wolltest du stattdessen die Regex `. * /` Verwenden? glenn jackman vor 5 Jahren 0

1 Antwort auf die Frage

0
glenn jackman

list die Variable, die den ersetzten Text enthält. $list der Wert der Spaltennummer, auf den der in der Variablen gespeicherte Wert verweist l. Da der lWert nicht mit Ziffern beginnt, behandelt awk die Zeichenfolge als Zahl "0". Sie erhalten $0also den aktuellen Datensatz.

Du willst das stattdessen

print "mv", $1, l 
Danke, genau das habe ich gesucht! Für Interessenten können Sie hier den Befehl verwenden, um alle Dateien mit demselben Namen zu packen und sie irgendwo zu finden. -name "debug.log" | awk ' '` Przemek Hugh Kaznowski vor 5 Jahren 0
Oder vielleicht `mv -b -t. ** / debug.log` (nicht getestet) glenn jackman vor 5 Jahren 0
War mir dessen nicht bewusst, danke nochmals fürs Teilen. Leider funktioniert es nicht, da es sich darüber beschwert, dass die Dateien denselben Namen haben, aber es lohnt sich, auf jeden Fall daran zu denken. Auch da ich in bash bin, funktioniert die "**" - Erweiterung nicht, würde aber in zsh wahrscheinlich für jeden Lesenden funktionieren Przemek Hugh Kaznowski vor 5 Jahren 0
"shopt -s globstar" ermöglicht ** glenn jackman vor 5 Jahren 0