Bash-Skript zum generieren der csv-Datei aus text
Ich habe eine Textdatei mit Datensätzen:
Data1
Data2
...
Data50
Muss ich schaffen eine .csv-Datei aus dem obigen text-Datei im folgenden format:
Type | Count | Name
Def | u1 | Data1
Def | u2 | Data2
.... | ..... | ....
Def | u50 | Data50
ich brauche ein bash-Skript zu generieren .csv-Datei, aus der text-Datei. Ich bin neu in shell-scripting! Ich habe gegangen durch die Grundlagen von awk und sed als gut.
Ich habe eine vage Idee, wie:
#!/bin/bash
type="Def"
x=1
count="u"
for F in ../test.txt
do
{
read \n
echo "$type, $count$x, $..." >> ../test.csv
x=x+1
} < $F
done
Ich verstehe, dass das Trennzeichen '\n'. Ich bin irgendwie verloren nach, dass.
Dank!
InformationsquelleAutor Tamaghna Guha Thakurta | 2015-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
speichern Sie diese in einer Datei, z.B. makecsv.rc:
dann ausführen als:
wenn nötig, Sie
chmod +x makecsv.rc
Der Vorteil ist, dass die input - /output-Dateinamen sind nicht
hardcoded
"$1"
und"$2"
wenn Sie nicht wollen, zu fest Dateinamen. Diecat
in backticks ist eher schrecklich.Das war super hilfreich, als ich brauchen würde, um es auszuführen in bestimmten Abständen mit verschiedenen Dateien! Vielen Dank!
Ich habe ein snippet zu meiner eigenen Antwort. Ihnen könnte ebenfalls umgestaltet werden, aber dann wäre es so ziemlich die gleiche Antwort...
die
for i in ``cat ``
wird explodieren, wenn die Daten, die ein Leerzeichen enthält...mein Kommentar ist für die andere Benutzer, die die Lösung verwenden, und Sie konnten einen Raum. Denken Sie daran, die Antworten sind für die künftigen Nutzer zu werden. Ich will nicht eine Kritik an deiner Antwort, aber ehrlich gesagt Stimme ich mit @tripleee - die einfache
cat
in backtick ist wirklich schrecklich und es ist gegen jede gute bash-Praxis. Auch in jede moderne shell, die$(command)
ist mehr bevorzugt, da die backticks.InformationsquelleAutor Roland
Ihre
for
- Schleife wird die Schleife nur ein einziges mal, er läuft über die Token, die Sie Liste und Sie nur aufgelistet (sieht aus wie ein Datei-name, so dass ich vermute, Sie wollen, um eine Schleife über Zeilen in der Datei):Könnten Sie auch einen externen nutzen für den Laufenden Nummern:
Umleitung außerhalb der Schleife ist effizienter, da die Schale nicht haben, um zu schließen und öffnen Sie die Ausgabe-Datei.
Wenn Sie möchten, übergeben Sie eine variable Dateinamen auf der Kommandozeile, ersetzen Sie einfach die hardcoded
../test.txt
mit"$1"
. Sie konnte entsprechend einstellen die Ausgabe-Datei-Namen, aber ich würde Sie einfach entfernen Sie die Ausgabe-Umleitung, und überlassen Sie es dem Anrufer, zu entscheiden, was zu tun mit dem Skript-Ausgabe.Wenn Sie Lesen müssen, mehrere Felder und Spalten auf Komma, optimieren Sie Ihre
IFS
.(
printf
wird empfohlen, überecho
, vor allem, wenn Ihre output-Anforderungen, die nicht trivial sind. Ich kann nicht zitieren$i
speziell, um loszuwerden, Sie alle führenden whitespace-Zeichen Hinzugefügt vonnl
vor der Zeilennummer. Ansonsten sollte man generell immer doppelte Anführungszeichen verwenden, um Ihre Variablen, es sei denn, Sie speziell benötigen die shell durchführen Leerzeichen tokenization und wildcard-expansion auf den Wert.)x=((x+1))
funktionierte nicht für mich, schade, ich weiß nicht, wieexpr
verwenden
x=$((x+1))
oderlet x++
Vielen Dank für die Zeit nehmen. Du hast es richtig, ich will Lesen mehrerer Zeilen in einer Datei. Wie ich bereits erwähnt ich bin neu in bash scripting. Also versuchte ich den ersten code, den Sie, Ihre mir Syntaxfehler bei 'fertig'! Können Sie mir einige Details über externen Dienstprogramm Sache.
Es gibt gute Gründe für das weglassen der Kopfzeile. Als die OP ' s Beispiel nicht ein, entweder, ich habe nicht hinzufügen; und würde empfehlen, gegen die es, wenn es eine Kopfzeile.
InformationsquelleAutor tripleee
Wenn Sie perl installiert haben, die
wird die Arbeit machen.
demo:
den
seq -f 'Some Data%g' 50
generieren Zeilen wie:also die
Drucke
Ich zitierte das Letzte Feld, denn der input, den Sie bekommen konnte
,
oder Leerzeichen.basierend auf @Roland Kommentars, das hinzufügen einer header-Zeile:
oder
Wenn Sie wollen
bash
Lösung, einfach verwenden:oder speichern Sie die
in einer Datei, wie "makecsv" und verwenden Sie es als
Ps: hmm.. die @tripleee ist
nl
kürzer ist alscat -n
😉InformationsquelleAutor jm666
Machen Sie das zweite Feld mit:
Das gesamte Skript wird:
Glück!
Der loop nur Schleifen jetzt zweimal...
Getestet habe ich diese auf meinem desktop-pc mit Cygnus, während Sie stackoverflow auf einem notebook, also musste ich zu geben. Habe ich einen Tippfehler?
Sie hatten Recht. Korrigiert habe ich mit
cat
mit Rücken-Zitate. Sorry, für die Beantwortung zu schnell 🙂Lesen mehrerer Variablen, nur eine Liste der Felder, die Sie wollen.
while read -r first second rest; do ... done <file
die entfernt auch die lästigen Probleme mitfor
hinter dem link im vorherigen Kommentar. Wenn Ihre Felder nicht-whitespace getrennt sind, können SieIFS=,
aufgeteilt auf Komma, zum Beispiel. All das ist sehr gut abgedeckt, in verschiedenen FAQs.InformationsquelleAutor Roland