2017-06-23 4 views
0

Ich versuche ein Bash-Skript zu entwickeln, das csv-Dateien (die stündlich generiert werden) einen Tag vorher filtert und sie zu einer einzigen CSV-Datei zusammenfügt. This Skript scheint die Arbeit für mich zu erledigen, außer dass ich versuche, Dateien basierend auf ihren Dateinamen zu filtern.Verschmelzung von CSV-Dateien basierend auf Dateinamensfilter

Es würde 24 Dateien für jeden Tag in dem Verzeichnis befinden, und ich brauche diese Dateien auf ihrem Namensformat filtern aus:

foofoo_2017052101502.csv 

foofoo_2017052104502.csv 

foofoo_2017052104503.csv 

foofoo_2017052204501.csv 

foofoo_2017052204504.csv 

Hier, ich brauche für den 21. Mai 2017, um herauszufiltern. Daher müssen meine CSV-Ausgangsdateien die ersten drei .csv-Dateien enthalten.

Was soll ich im Skript für diesen Filter hinzufügen?

+0

Warum nicht 'cat foofoo_20170521 * .csv> combined_20170521.csv'? –

+0

Können Sie bitte die Antwort akzeptieren, wenn es funktioniert –

Antwort

1

Das folgende Skript berechnet den vorherigen Tag yyyymmdd und verwendet diesen Wert im Grep, um automatisch alle am Vortag generierten Dateinamen herauszufiltern.

Für MacOS

dt=`date -j -v-1d +%Y%m%d` 
echo $dt 
OutputFiles=`ls | grep foofoo_${dt}`  

Für Linux

dt=`date -d "yesterday" +%Y%m%d` 
echo $dt 
OutputFiles=`ls | grep foofoo_${dt}`  

wenn diese Befehle in das Skript hinzugefügt, um die Dateinamen für den vorherigen Tag auf dem aktuellen Zeitstempel basierend erwähnt wird filtern.

+0

Was wäre in diesem Fall var2? –

+0

Es war dt Zeichenfolge. Es sollte jetzt funktionieren. –

+1

Gut, wenn es darum geht, je nach Betriebssystem Unterschiede zwischen den verschiedenen 'date'-Implementierungen anzubieten. –

1

können Sie lassen bash die Filterung für Sie tun globbing, beispielsweise nur Dateien mit Datum aufzulisten May 21, 2017 Sie konnten verwenden:

for filename in foofoo_20170521*.csv; do... 

Wenn Sie Ihr Skript aufrufen mit einem Argument Spezifizierungs der Lage sein wollen

for filename in "foofoo_${1}*.csv"; do... 

Und dann das Skript mit dem Datum nennen, die Sie als Argument filtern mögen: das Datum, um mehr Flexibilität zu haben, können Sie verwenden

./your_script 20170521 

Und @ David C. Rankin in den Kommentaren erwähnt, eine sehr praktische Art und Weise, es zu tun wäre alles ab dem Datum der Dateien verketten Sie in eine csv mögen, die Sie dann in Ihrem Skript verwenden würden:

cat foofoo_20170521*.csv > combined_20170521.csv 
+1

Es scheint auch 'Katze' und * Umleitung * sollte auch erwähnt werden. (siehe Kommentar zur ursprünglichen Frage) –

+0

@ DavidC.RankinDas ist ein sehr schlauer Weg zu gehen. Ich habe meine Antwort aktualisiert, um sie aufzunehmen. – archemiro

+1

':)' Ja, ab und zu kann "cat" tatsächlich für den beabsichtigten Zweck verwendet werden. –

Verwandte Themen