2010-11-30 5 views
0

J'ai beaucoup de fichiers txt comme ceci:Making csv à partir de fichiers txt

Title 1 
Text 1(more then 1 line) 

Et je voudrais faire un fichier csv de tous qu'il ressemblera à ceci:

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

Comment pourrais-je le faire? Je pense que l'awk est bon pour ça mais je ne sais pas comment le réaliser.

+1

Il serait utile si vous avez formaté votre code d'une manière lisible et a montré moi des exemples de données d'entrée et ce que vous voulez que les données de sortie ressemblent. Vous dites "bash", mais le seul "bash" est la boucle 'for' et la redirection. La majeure partie est AWK. –

Répondre

1

Je suggère:

paste -d, file1 file2 file3 

Pour gérer un grand nombre de fichiers, max 40 par fichier de sortie (non testé, mais proche):

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

C'est à peu près ce que vous avez publié avec quelques améliorations .

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:

Si vous avez un tas de fichiers qui se composent de deux lignes, essayez ceci:

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

Si les fichiers contiennent plus de deux lignes chacune alors il mettra chaque paire de lignes sur la même ligne séparées par une virgule.

+0

Oui, mais cela ne fonctionne pas. En résultat, je reçois une colonne, pas deux colonnes. – llokely

+1

@llokely: cela fonctionne-t-il mieux si vous changez le premier 'print' en' printf $ 0'? Cela aiderait beaucoup si vous incluiez des exemples dans votre question. –

+0

Non, rien n'a changé – llokely

0

3 fichiers contenant Étant donné les données suivantes:

file1.txt

Heading 1 
Text 1 
Text 2 

file2.txt

Heading 2 
Text 1 

file3.txt

Heading 3 
Text 1 
text 2 
Text 3 

Les résultats attendus sont:

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

Pour cela, utilisez le createcsv.awk de programme ci-dessous invoquée comme

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

Ou invoquer comme fichier gawk -f createcsv.awk * .txt – jgreep

Questions connexes