2010-11-30 2 views
0

У меня есть много текстовые файлы, как это:Создание CSV из тхт файлов

Title 1 
Text 1(more then 1 line) 

И я хотел бы сделать один файл CSV из всех из них, что это будет выглядеть следующим образом:

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

Как я мог это сделать? Я думаю, что awk хорош для него, но не знаю, как это реализовать.

+1

Это поможет если вы отформатировали свой код читаемым образом и показали я пример ввода данных и то, что вы хотели бы, чтобы выходные данные выглядели. Вы говорите «bash», но единственным «bash» является цикл `for` и перенаправление. Основная его часть - AWK. – 2010-11-30 16:29:57

ответ

1

Могу ли я предложить:

paste -d, file1 file2 file3 

Для обработки большого количества файлов, не более 40 за выходной файл (непроверенные, но близко к этому):

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

Это примерно то, что вы вывесили с некоторыми улучшениями ,

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:

Если у вас есть куча файлов, которые состоят только из двух линий, попробуйте следующее:

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

Если файлы содержат более двух строк каждый, то это поместит каждую пару линий в одну и ту же строку, разделенную запятой.

+0

Да, но это не сработает. В результате я получаю один столбец, а не два столбца. – llokely 2010-12-01 09:39:52

+1

@llokely: он работает лучше, если вы измените первый `print` на` printf $ 0`? Это очень помогло бы, если бы вы включили некоторые примеры в свой вопрос. – 2010-12-01 17:37:00

0

Учитывая 3 файлы, содержащие следующие данные:

FILE1.TXT

Heading 1 
Text 1 
Text 2 

file2.txt

Heading 2 
Text 1 

file3.txt

Heading 3 
Text 1 
text 2 
Text 3 

Ожидаемые результаты:

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

Это достигается с помощью программы createcsv.awk ниже вызывается как

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; 
} 
Смежные вопросы