Bash: Liest eine Datei Zeile für Zeile und verarbeitet jedes Segment als Parameter für andere Prog
Habe ich einige schmutzige Arbeit zu tun, so ein Bash-Skript scheint eine gute Wahl zu sein. Ich bin neu in der Bash, und die Erfahrung macht mich ziemlich frustriert.
Die Datei mapfiles.txt besteht aus Linien, die als Folge. Jede Zeile hat vier Segmente, getrennt durch ein Leerzeichen. Jedes segment stellt einen input-parameter an ein externes Programm namens 'prog'. Zum Beispiel, "cm19_1."png" ist die mit dem Namen"0001" index"121422481" Längeund "31035995" latitude.
Datei: mapfiles.txt
cm19_1.png 0001 121422481 31035995
cm19_2.png 0002 121423224 31035995
cm19_3.png 0003 121423967 31035995
…
Möchte ich ausführen, ähnliche Befehle, um jede Zeile. Wie unten gezeigt, das prog input-parameter Reihenfolge ist etwas anders. Es macht also Sinn, zu schreiben, ein bash-Skript zu behandeln, die wiederholte Arbeit.
[Usage] prog <index> <longitude> <latitude> <filename>
example: prog 0001 121422481 31035995 cm19_1.png
In der Regel die bash-script funktionieren auf diese Weise:
- Lesen einer Zeile aus mapfiles.txt
- Teilen Sie die Segmente
- Rufen Sie das prog mit einem richtigen parameter, um
Hier kommt run.sh.
#!/bin/sh
input=mapfiles.txt
cmd=prog
while read line
do
file=$(echo $line | cut -d' ' -f1)
key=$(echo $line | cut -d' ' -f2)
log=$(echo $line | cut -d' ' -f3)
lat=$(echo $line | cut -d' ' -f4)
echo $cmd $key $log $lat $file
done < "$input"
Was ich erwartet habe ist
prog 0001 121422481 31035995 cm19_1.png
prog 0002 121423224 31035995 cm19_2.png
prog 0003 121423967 31035995 cm19_3.png
…
Das TATSÄCHLICHE Ergebnis, die ich habe ist
cm19_1.png21422481 31035995
cm19_2.png21423224 31035995
cm19_3.png21423967 31035995
Probleme, dass verwirrt mich
- Wo ist 'prog'?
- Wo ein Leerzeichen ist?
- Was ist falsch mit dem parameter order?
Hmm... schrieb ich dieses Skript auf meinem Mac mithilfe von vim und kopieren Sie es auf einem Scientific Linux box und ein gentoo-box. Diese drei Typen das gleiche lächerliche Ausgänge.
InformationsquelleAutor der Frage Jianwen W. | 2011-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie vereinfachen vieles:
InformationsquelleAutor der Antwort Mat
Mit GNU Parallel, Sie können es tun in einer einzigen Zeile + Sie erhalten es getan in der parallelen for-free:
Uhr die intro-videos, um mehr zu erfahren: http://www.youtube.com/watch?v=OpaiGYxkSuQ
InformationsquelleAutor der Antwort Ole Tange
prog
haben könnte, verschwand da$cmd
ist nicht exportiert. Ihre version von /bin/sh könnte ausführen derwhile
- Anweisung in eine separate Schale. Sollte dies nicht der Fall sein, und dies ist nicht der Fall für meine installation von bash, aber vielleicht deins verhält sich in interessanter Weise in dieser Abteilung.UPD ich sehe, haben Sie mehrere Boxen, die den gleichen Ergebnissen führen. Dies macht die subshell Theorie unwahrscheinlich. Vielleicht haben Sie ein paar lustige Zeichen, die Sie in Ihrem Skript-und/oder Quell-Datei.
Habe ich kopiert und eingefügt, Ihr Skript und Ihre in der source-Datei auf meiner gentoo-box und es gibt die erwarteten Ergebnisse. Vielleicht sollten Sie das gleiche tun, und vergleichen Sie die Dateien mit Ihrem ursprünglichen.
InformationsquelleAutor der Antwort n.m.