2010-11-30 17 views
0

Ich habe eine Menge von TXT-Dateien wie folgen aus:Herstellung csv von TXT-Dateien

Title 1 
Text 1(more then 1 line) 

Und ich mag eine CSV-Datei aus alle von ihnen machen, dass es wie folgt aussehen:

Title 1,Text 1 
Title 2,Text 2 
Title 3,Text 3 
etc 

Wie könnte ich es tun? Ich denke, dass awk gut dafür ist, aber ich weiß nicht, wie ich es realisieren soll.

+1

Es würde helfen, wenn Sie Ihren Code lesbar formatiert haben und dies gezeigt haben Ich habe Beispieldaten eingegeben und wie die Ausgabedaten aussehen sollen. Sie sagen "bash", aber der einzige "bash" ist die for-Schleife und die Umleitung. Der Großteil davon ist AWK. –

Antwort

1

Darf ich vorschlagen:

paste -d, file1 file2 file3 

eine große Anzahl von Dateien zu verarbeiten, max 40 pro Ausgabedatei (ungetestet, aber in der Nähe):

xargs -n40 files... echo >tempfile 
num=1 
for line in $(<tempfile) 
do 
    paste -d, $line >outfile.$num 
    let num=num+1 
done 
0

Das ist ungefähr das, was man mit einigen Verbesserungen veröffentlicht .

for text in * 
do 
    awk 'BEGIN {q="\""; print q} 
     NR==1 { 
       gsub(" "," ") # why? 
       gsub("Title: *","") 
       print 
       } 
     NR>1 { 
       gsub(" "," ") # why? 
       gsub("Content: *","") 
       gsub(q,q q) 
       print 
       } 

     END {print q}' "$text" >> ../final 
done 

Edit:

Wenn Sie eine Reihe von Dateien, die aus nur zwei Linien bestehen, versuchen Sie dies:

sed 'N;s/\n/,/' file*.txt 

Wenn die Dateien mehr als zwei Zeilen enthalten jeweils dann wird jedes Zeilenpaar auf dieselbe Zeile setzen, die durch ein Komma getrennt sind.

+0

Ja, aber es funktioniert nicht. Im Ergebnis bekomme ich eine Spalte, nicht zwei Spalten. – llokely

+1

@llokely: funktioniert es besser, wenn Sie den ersten 'print' in' printf $ 0' ändern? Es würde wirklich sehr helfen, wenn Sie einige Beispiele in Ihre Frage einschließen würden. –

+0

Nein, nichts geändert – llokely

0

3 Dateien Bei den folgenden Daten:

file1.txt

Heading 1 
Text 1 
Text 2 

file2.txt

Heading 2 
Text 1 

file3.txt

Die erwarteten Ergebnisse sind:

Heading 1,Text 1,Text 2 
Heading 2,Text1 
Heading 3,Text 1,text 2,Text 3 

Dies wird erreicht, das Programm createcsv.awk mit unten aufgerufen, wie

gawk -f createcsv.awk file1.txt file2.txt file3.txt 

createcsv.awk

{ 
    if (1 == FNR) { 
    # It is the first line of a new file 
    if (csvline != "") { 
     # First file or empty files we can ignore 
     print csvline; 
    } 
    csvline = ""; 
    delimiter = ""; 
    } 
    csvline = csvline delimiter $0; 
    if ("" == delimiter) { delimiter="," } 
} 
END{ 
print csvline; 
} 
+0

Oder als gawk -f createcsv.awk Datei * .txt aufrufen – jgreep

Verwandte Themen