2017-02-14 2 views
1

Ich habe ein Skript anwenden:Wie Einfügen-Befehl rekursiv in einem Skript

paste -d, <(cut fileA1 -d, -f1-6) <(cut fileB1 -d, -f7) > fileC1 

die zwei Text csv Dateien fileA1 und fileB1, kopiert die ersten sechs Spalten von fileA1 und fügt sie (mit Ersatz) in die Takes erste 6 Spalten von fileB1. Die Ausgabe wird dann in einer neuen Datei fileC1 gespeichert.

Nun würde Ich mag diese in folder A (fileA1...fileAn) zu n-Dateien erweitern und folder B (fileB1...fileBn) und die Ausgabe in Dateien zu folder C (fileC1...fileCn) speichern. Alle Eingabedateien haben die gleiche Anzahl von Zeilen.

Ich habe mit diesem

fileA1=find /path/to/folderA -name '.csv' 
fileB1=find /path/to/folderB -name '.csv' 

paste -d, <(cut fileA1 -d, -f1-6) <(cut fileB1 -d, -f7) > *.csv 

kommen aber es funktioniert nicht. Irgendwelche Ideen?

+0

Beachten Sie, dass 'cut' und' paste' nicht sind die besten Werkzeuge, um überhaupt mit CSV-Dateien zu arbeiten. Sie können Datensätze mit Komma-enthaltenden Feldern nicht korrekt verarbeiten. – chepner

Antwort

2

Sie benötigen eine explizite Schleife. Es sieht nicht so aus, als ob Sie irgendeine Funktion von find verwenden, die nicht in der Shell ausgeführt werden kann, also werde ich sie überspringen.

a_files=(/path/to/folderA/*.csv) 
b_files=(/path/to/folderB/*.csv) 

Als nächstes gehe ich davon aus, dass Ihre Dateinamen so sind, dass die beiden Arrays synchronisiert sind; das erste Element jeder gehen zusammen usw.

for ((i=0; i<"${#a_files[@]}"; i++)); do 
    paste -d, <(cut "${a_files[i]}" -d, -f1-6) \ 
       <(cut "${b_files[i]}" -d, -f7-) > fileC"$i".csv 
done 

Hier bin ich den Namen der Ausgabedatei unter der Annahme, kann wie folgt aufgebaut sein. (Das bedeutet auch, dass Sie möglicherweise dasselbe für die Eingabedateien tun können; die einzige Variable wäre hier der Bereich 0-n, der i iteriert.)

+0

Danke für deinen Beitrag @chepner. Es funktionierte mit ein paar Änderungen: "$ {a_files [@]}" geändert in '" $ {# a_files [@]} "'und' (cut" $ {b_files [i]} "-d, -f1-7) 'Geändert zu' (ausschneiden "$ {b_files [i]}" -d, -f7-) '. Ohne die zweite Änderung bestand Datei C nur aus den ersten 6 und 7 Spalten von A und B. Das Skript hat 200 Dateien von je 300MB in nur 10 Minuten verarbeitet! – Buzz

+0

Danke, ich habe die Änderungen in die Antwort aufgenommen; das erste war ein Tippfehler, und das zweite lag daran, dass ich den ursprünglichen Code nicht sorgfältig gelesen hatte. – chepner

Verwandte Themen