Ich habe folgendes Skript geschrieben:
#!/bin/bash
#files list
file1=/tmp/1wall_long.txt
file2=/tmp/1wall_test1.txt
file3=/tmp/1wall_test2.txt
file4=/tmp/1wall_test3.txt
file5=/tmp/3mt_long.txt
file6=/tmp/3mt_OpenSpace_test1.txt
file7=/tmp/3mt_OpenSpace_test2.txt
file8=/tmp/3mt_OpenSpace_test3.txt
file9=/tmp/3rooms_test1.txt
file10=/tmp/3rooms_test2.txt
file11=/tmp/3rooms_test3.txt
file12=/tmp/20mt_OpenSpace_test1.txt
file13=/tmp/20mt_OpenSpace_test2.txt
file14=/tmp/20mt_OpenSpace_test3.txt
#script for 1wall_long file
if [ ! -e "$file1" ]; then #check if the file exist
echo "File 1wall_long.txt does not exist" #if not exist print echo output
else
sed -i -e 's/- /-/g' $file1 #remove space on the first 10 values
awk '{print $7}' $file1 > /tmp/1wall_long_S.txt #print the column number 7 and copy the output in a file
rm $file1 #remove old file
fi
Das Skript wird für alle in der Variablen beschriebenen Dateien wiederholt (im Grunde habe ich dasselbe Skript 14 Mal mit verschiedenen Variablen wiederholt). Gibt es einen besseren Weg, dies zu tun, und was ist die beste Vorgehensweise in diesen Situationen?
bash
shell-script
Federi
quelle
quelle
Antworten:
Persönlich würde ich es vermeiden, die Dateinamen fest zu codieren. Das ist selten eine gute Idee und es ist normalerweise besser, die Option zu haben, Zieldateien als Argumente zu übergeben. Außerdem ändern Sie die vorhandene Datei und löschen dann das Original. Das ist nicht effizient. Ändern Sie einfach die Datei im laufenden Betrieb und drucken Sie die 7. Spalte, ohne sie auf die Festplatte schreiben zu müssen. Zum Beispiel:
Anschließend können Sie das Skript folgendermaßen ausführen:
Wenn Sie möchten, dass die Namen fest codiert werden, verwenden Sie einfach ein Array, wie von @choroba vorgeschlagen:
quelle
sed -i
fügen nur zusätzliche Arbeit hinzu. Da Sie die Datei trotzdem löschen, gibt es keinen Grund für die Verwendung,-i
wodurch nur ein unnötiger Schreibvorgang auf die Festplatte hinzugefügt wird. Mein erster Vorschlag ist anders: Anstatt die Dateinamen in das Skript zu schreiben, übergeben Sie sie als Argumente. Auf diese Weise können Sie die Dateien, auf denen es ausgeführt wird, einfach ändern.${var%pattern}
gibt den Wert von$var
mitpattern
vom Ende entfernt zurück. Also${file%.*}
wird der letzte Punkt und alles danach entfernt. (Hinweis:foo.bar.baz
wirdfoo.bar
. Wenn Sie verwenden%%
, wird esfoo
.)schleifenlos
Verwenden Sie zuerst eine Funktion
NEIN, es dreht sich alles space-um -auf der Linie, sei da 1, 4, 10 oder 255.
dann keine Notwendigkeit mehr var
(vorausgesetzt, Sie verwenden fileXX var nicht mehr).
schleifenlos (Sol. 2)
Wenn Sie mehr Argumente übergeben möchten und Terdons Optimierungsversuch verwenden möchten
angerufen werden mit
Diese Funktionen können in .bashrc definiert und interaktiv verwendet werden.
mit Schleife
quelle
Sie können ein Array von Dateien verwenden und eine Schleife darüber erstellen mit
for
:quelle