2016-11-24 3 views
0

У меня есть несколько файлов в директории, мне нужно переформатировать и поместить вывод в один файл, структура файла:переформатирования текстового файла из строк в столбец

======================================================== 
Daily KPIs - DATE: 24/04/2013 
======================================================== 

-------------------------------------------------------- 
Number of des   = 5270 
-------------------------------------------------------- 
Number of users  = 210 
-------------------------------------------------------- 
Number of active  = 520 
-------------------------------------------------------- 
Total non    = 713 
-------------------------------------------------------- 

======================================================== 

мне нужна выходной формат, чтобы быть:

Date,Numberofdes,Numberofusers,Numberofactive,Totalnon 
24042013,5270,210,520,713 

каталог насчитывает около 1500 файлов с тем же форматом и им с помощью Centos 7.

Благодарности

+3

[Переполнение стека] (http://stackoverflow.com/tour) - это вопрос и ответ для профессиональных программистов и энтузиастов. Пожалуйста, покажите свои усилия по кодированию. – Cyrus

+0

hi Cyrus, это то, что я до сих пор сделал: cat file.txt | sed 's/// g' | sed 's/- // g' | sed 's/======== ================================================ // g '| awk -F' [=;] '' {print $ 2} '| sed'/^ $/d '| tr "/ n" "," .. мой вывод - 1128 718 7308 9154, im не удалось получить даты в колонке. –

+1

Пожалуйста, добавьте это на свой вопрос. – Cyrus

ответ

1

Сначала нам нужен способ объединения элементов массива в строку (ср.Join elements of an array?):

function join_array() 
{ 
    local IFS=$1 
    shift 
    echo "$*" 
} 

Тогда мы можем цикл по каждому из файлов и конвертировать каждый в список разделенных запятыми (при условии, что исходный файл имеет имя, заканчивающийся в *.txt).

for f in *.txt 
do 
    sed -n 's/[^:=]\+[:=] *\(.*\)/\1/p' < $f | { 
     mapfile -t fields 
     join_array , "${fields[@]}" 
    } 
done 

Здесь команда sed выглядит внутри каждого входного файла для линий, которые:

  1. начинаются с подстроки, которая содержит ни :, ни = знака ([^:=]\+ часть);
  2. затем следуйте за : или = и произвольным количеством пробелов ([:=] *);
  3. , наконец, конец с произвольной подстрокой (часть *\(.*\)).

Последняя подстрока затем захватывается и печатается вместо исходной строки. Любая другая строка во входных файлах будет удалена.

После этого выходной сигнал sed считывается mapfile в переменную индексированный массив fields (The -t гарантирует, что символ перевода строки из каждой строки чтения отбрасываются) и, наконец, линии соединяются благодаря нашему ранее определенного join_array метода.

Причина, по которой нам необходимо обернуть mapfile внутри подоболочки, поясняется здесь: readarray (or pipe) issue.

+2

Woot, вы попали # 1 в список [Bash Pitfalls] (http://mywiki.wooledge.org/BashPitfalls). – ghoti

+0

@ghoti, исправлено! Спасибо. –

+0

wow, это прекрасно работает, единственное, что не хватает, это заголовок, любой способ его включить? не могли бы вы объяснить это решение? .. спасибо –

Смежные вопросы