2017-06-27 3 views
0

Eine grundlegende Unix-Frage.Unix: Dateiname aus einer anderen Datei verwenden

Ich habe ein Skript, das die Anzahl der Datensätze in einer Delta-Datei zählt.

awk '{ 
    n++ 
    } END { 
    if(n >= 1000) print "${completeFile}"; else print "${deltaFile}"; 
    }' <${deltaFile} >${fileToUse} 

Dann je nach Zustand IF, möchte ich die entsprechende Datei verarbeiten:

cut -c2-11 < ${fileToUse} 

Aber wie verwende ich den Inhalt der Datei mit dem Dateinamen selbst?
Und wenn es irgendwelche Feinabstimmungen zu machen gibt, fühlen Sie sich frei.

Vielen Dank im Voraus
Prost
Simon

+0

Was ist '$ {completeFile}'? – RomanPerekhrest

+0

'$ {completeFile}' und '$ {deltaFile}' sind nur Variablennamen für die eigentlichen Dateien. Die Idee ist, ich habe einen Pre-Prozessor, der diesen Monat completeFile mit dem letzten Monat completeFile vergleicht. Die Ausgabe dieses Vergleichs ist deltaFile. Meistens ist es leer, aber wenn die deltaFile größer als xx% der completeFile ist (der> = 1000 Schritt), dann möchte ich die completeFile über fileToUse zum nächsten Prozess bringen ... sonst nehme ich die deltaFile zum nächsten Prozess über fileToUse – sigmazen

+0

Sie brauchen wahrscheinlich nicht deltaFile, noch die meisten der Schritte, die Sie sprechen. Es könnte sinnvoll sein, nur awk diesen Monat completeFile mit dem letzten Monat completeFile vergleichen und von dort aus gehen. Bearbeiten Sie Ihre Frage, um eine übersichtliche, testbare Beispieleingabe (dh die vollständigen Versionen) und die erwartete Ausgabe einzubeziehen, damit wir Ihnen helfen können. Das fühlt sich sehr nach einer XY-Frage an. –

Antwort

1

als Dateinamen, um den Inhalt einer Datei zu verwenden, die sich durch eine Variable identifiziert ist (wie gefragt)

cut -c2-11 <"$(cat $filetouse)" 
// or in zsh just 
cut -c2-11 <"$(< $filetouse)" 

es sei denn, der Dateiname in der Die Datei endet mit einem oder mehreren Newline-Zeichen, was die Leute nur selten tun, weil es ziemlich umständlich und unbequem ist. Dann etwas wie:

read -rdX var <$filetouse; cut -c2-11 < "${var%?}" 
// where X is a character that doesn't occur in the filename 
// maybe something like $'\x1f' 

Tweaks: Ihre awk druckt die Variable Referenz${completeFile} oder ${deltaFile} (weil sie innerhalb der einfachen Anführungszeichen awk Skript sind) nicht der Wert entweder variabel. Wenn Sie den Wert tatsächlich wollen, wie ich aus Ihrer Beschreibung erwarten würden, sollten Sie die Shell Vars passieren zu awk vars wie diese

awk -vf="$completeFile" -vd="$deltaFile" '{n++} END{if(n>=1000)print f; else print d}' <"$deltaFile"` 
# the " around $var can be omitted if the value contains no whitespace and no glob chars 
# people _often_ but not always choose filenames that satisfy this 
# and they must not contain backslash in any case 

oder exportieren die Schale vars als env vars (wenn sie nicht bereits) und greifen Sie wie

awk '{n++} END{if(n>=1000) print ENVIRON["completeFile"]; else print ENVIRON["deltaFile"]}' <"$deltaFile" 

auch Sie nicht Ihren eigenen Zähler benötigen, awk zählt bereits eingegebenen Datensätze

awk -vf=... -vd=... 'END{if(NR>=1000)print f;else print d}' <... 

oder mehr kurz

awk -vf=... -vd=... 'END{print (NR>=1000?f:d)}' <... 

oder ein Dateiargument statt Umleitung verwenden, um den Namen für das Skript

awk -vf="$completeFile" 'END{print (NR>=1000?f:FILENAME)}' "$deltaFile" # no < 

und Sperre Hinterzeilenumbrüche wie oben Sie überhaupt eine Zwischendatei brauchen nicht verfügbar ist, nur

cut -c2-11 <"$(awk -vf="$completeFile" -'END{print (NR>=1000?f:FILENAME)}' "$deltaFile")" 

oder Sie tun müssen, awk nicht wirklich, wc das Zählen tun und jede POSIX oder klassische Schale kann

dem Vergleich zu tun
+0

Eine fantastische Antwort ... Vielen Dank Dave, dass du dir die Zeit genommen hast, so gründlich zu antworten. Das fehlende Key-Stück kam von '$ {fileToUse}' zu '" $ (cat $ fileToUse) "' wodurch es perfekt funktionierte. Ihre zusätzlichen Kommentare sind brilliant und ich habe sie eingefügt, um die ganze Aussage zu rationalisieren. Danke nochmal – sigmazen

Verwandte Themen