2016-10-06 3 views
0

Ich habe ein Problem mit awk im Terminal. Ich brauche viele Dateien in einer Gruppe von aktuellem Verzeichnis zu einem anderen zu bewegen, und ich habe die Liste der benötigten Dateien in einer Textdatei, wie:awk print overwrite strings

filename.txt

file1 
file2 
file3 
... 

ich in der Regel digit :

paste filename.txt | awk '{print "mv "$1" ../dir/"}' | sh 

und es ausführt:

mv file1 ../dir/ 
mv file2 ../dir/ 
mv file3 ../dir/ 

es funktioniert in der Regel, aber jetzt ist der Befehl ändert sein Verhalten und awk überschreibt die letzte Zeichenfolge ../dir/ auf dem ersten wieder anfahren will, den Druckbefehl von der Ausgangsposition, zu erhalten:

../dire1 ../dir/ 
../dire2 ../dir/ 
../dire3 ../dir/ 

und natürlich kann sie nicht ausgeführt werden. Was ist passiert? Wie löse ich es?

Antwort

2

Ihre Eingabedatei enthält Wagenrücklauf (\r aka control-M). Führen Sie dos2unix darauf aus, bevor Sie ein UNIX-Tool darauf ausführen.

idk was Sie verwenden Paste für obwohl, und Sie sollten überhaupt nicht awk für diese überhaupt, es ist nur ein Job für eine einfache Shell-Skript, z. Entfernen Sie die echo sobald Sie getestet haben dies:

$ < file xargs -n 1 -I {} echo mv "{}" "../dir" 
mv file1 ../dir 
mv file2 ../dir 
mv file3 ../dir 
0

Sie können Ihre awk-Programm ändern, um die \r zu entfernen, indem sub(/\r/,"") am Anfang des Programms zu ergänzen:

$ awk '{sub(/\r/,""); print "mv "$1" ../dir/"}' filename.txt 
mv file1 ../dir/ 
mv file2 ../dir/ 
mv file3 ../dir/