ubuntuusers.de

Ordner über Schleife abarbeiten

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

y.g.

Anmeldungsdatum:
29. Mai 2011

Beiträge: 44

Hallo, ich hab folgendes vor:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Code
#!/bin/bash

## working directory
DIR1=/home/...
## Var's ##
#REF1-REF66
REF1=bla.txt
for i in $REF1 - $REF66; do
# $NF takes the last field in .txt data
awk '{if($NF>=0 && $NF<=50000){count+=1}} END{print count}' ${DIR1}${i} >${DIR1}${i}${OUT}
done

Die 66 Variablen sind alles .txt Dateien, die im selben Ordner sind. Die sollen alle über die Schleife abgearbeitet werden. Ich würde mir gerne die Variablendefinition der 66 Variablen sparen und nur sagen: nimm alle im Ornder befindlichen Files und do. Gibt es da eine Möglichkeit?

Noch eine weitere Frage: Ist es möglich, dann ein File auszuschreiben mit 3 Spalten: | Filename | count (aus bash)| $NF aus aktuellem File | und das jeweils Spaltenweise erweitern für die einzelenen Files?

Danke:)!

stfischr Team-Icon

Avatar von stfischr

Anmeldungsdatum:
1. März 2007

Beiträge: 19197

Hi.

1
2
3
4
5
#!/bin/bash
for i in "/home/user/ordner/*.txt"; do
# $NF takes the last field in .txt data
awk '{if($NF>=0 && $NF<=50000){count+=1}} END{print count}' ${i} >${i}${OUT}
done

so?

y.g.

(Themenstarter)

Anmeldungsdatum:
29. Mai 2011

Beiträge: 44

Perfekt:)

Dann noch die Frage: Noch eine weitere Frage: Ist es möglich, dann ein File auszuschreiben mit 3 Spalten: | Filename | count (aus bash)| $NF aus aktuellem File | und das jeweils Spaltenweise erweitern für die einzelenen Files?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Du hast eine ganz böse Falle eingebaut:

Weil Du die Variablen nicht "gequotet" hast, wird die Kiste übelst schief gehen, sobald auch nur ein Leer- oder Sonderzeichen im Dateipfad auftaucht !
Dann sind die Daten kaputt, und je nachdem was Du mit ihnen machst, können auch völlig unbeteiligte Dateien kaputt geschrieben werden.

Also: grundsätzlich immer und überall die Variablen alle "quoten" !

Natürlich kannst Du mit awk auch noch alles mögliche ausgeben lassen. - Ohnehin würde ich lieber das blöde Shellskript weglassen, und gleich alles mit awk erledigen. Was stellt $count eigentlich dar ? (die kannst Du doch bestimmt auch mit awk erzeugen)
Im Zweifel solltest Du nochmal an einem Beispiel erklären, was als Ergebnis in welche Datei geschrieben werden soll. Das habe ich nämlich noch nicht verstanden.

LG,

track

y.g.

(Themenstarter)

Anmeldungsdatum:
29. Mai 2011

Beiträge: 44

Hi, danke, dass wusste ich nicht mit dem quoten. count ist lediglich ein Counter für die Einträge in der letzten Spalte zwischen 0 und 50000. Ich lasse es als shell-script, da es Bestandteil einer Pipeline ist und noch ein Script da drin aufgerufen wird.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

Außerdem wird $OUT nie gesetzt und die Verwendung von groß geschriebenen Variablennamen für interne Variablen macht das ziemlich unübersichtlich.

stfischr schrieb:

1
2
3
4
5
#!/bin/bash
for i in "/home/user/ordner/*.txt"; do
# $NF takes the last field in .txt data
awk '{if($NF>=0 && $NF<=50000){count+=1}} END{print count}' ${i} >${i}${OUT}
done

so?

Nein, denn Du quotest die Glob-Expression in der for-Schleife.

Eher so

1
2
3
for f in /home/user/ordner/*.txt; do
  awk '{if($NF>=0 && $NF<=50000){count+=1}} END{print count}' "$f" >"$f.out"
done

Ciao

robert

Antworten |