2017-11-30 3 views
3

Ich versuche unter bash Skript auf mehr als 1 Million csv-Datei auszuführen:Run Bash-Skript auf Millionen von CSV-Dateien

#!/bin/bash 
new_header="cell,id,too,issue,valid,DPT,RH,TMP,U,V" 
sed -i'' "1s/.*/$new_header/" /cygdrive/d/csv/*.csv 

Aber während dieser Code ausgeführt ich die folgende Störung erhalte:

./bash.sh: line 3: 11464 Segmentation fault  (core dumped) sed -i'' "1s/.*/$new_header/" /cygdrive/d/csv/*.csv 

Ich bin sicher, es gibt eine Möglichkeit, Skript auf 1 Million csv Dateien auszuführen, aber ich habe noch nichts gefunden.

Antwort

1

Gut gemacht auf die Segmentation Fault, die eigentlich nicht passieren sollte.

Ich würde eine find hier (oder möglicherweise xargs) verwenden. Es kann das Ergebnis in viele Anrufe aufteilen und nie etwas mit 1.000.000 Argumenten machen

find hat einen -exec Schalter, der es erlaubt, einen Befehl mit den gefundenen Dateien auszuführen, anstatt einfach zu drucken.

+0

Danke! Aber ich benutze das Bash-Skript zum ersten Mal .. Ich weiß nicht, wie das 'Finden' funktioniert. Könnten Sie bitte im Code erzählen? Ich schätze deine Bemühungen sehr. – Kaushik

+1

Ich glaube Tom Fenech hat das vielleicht schon in seiner Antwort getan. Zu Ihrer Information, in der Kommandozeile sollten Sie 'man find' für das Handbuch aufrufen können. Auch google "linux man find" sollte mit dem gleichen Handbuch im Web aufwarten. –

+0

danke für Ihre Hilfe! – Kaushik

5

Ich denke, dass die Länge der Befehlszeile, die durch das Erweitern /cygdrive/d/csv/*.csv generiert wird, zu lang ist.

Eine Möglichkeit, dies zu umgehen, indem find Verwendung wäre:

find /cygdrive/d/csv/ -name '*.csv' -exec sed -i '' "1s/.*/$new_header/" {} + 

Dies läuft die minimale Anzahl von separaten sed Prozesse erforderlich, innerhalb der Grenzen der Befehlslänge zu halten.

Wie in den Kommentaren erwähnt, wenn Ihre Version von sed benötigt ein Argument nach -i (GNU sed nicht), dann benötigen Sie ein Leerzeichen vor ''. Ansonsten können Sie einfach '' entfernen.

+0

Vielen Dank !! Ich führe diesen Befehl aus. – Kaushik

+1

'sed -i''' ist dasselbe wie' sed -i'. Wenn wir wirklich ein Null-Argument an '-i' übergeben wollen, sollten wir es als 'sed -i' ''aufrufen. – codeforester

+0

@TomFenech, Wenn ich diesen Code auf nur 200 Dateien ausführen, funktioniert es gut, aber wenn ich diesen Code auf dem Verzeichnis ausgeführt, das 1 Million 'CSV'-Dateien enthält. Es funktioniert nicht. Irgendwelche Kommentare? – Kaushik