2016-11-24 68 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 

目錄具有使用Centos的格式同在1500的文件和IM 7

感謝

+3

[Stack Overflow](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(該-t確保來自每一行讀出後的換行符被丟棄),最後行到我們的先前定義的join_array方法接合感謝。

我們需要在子殼體內包裝mapfile的原因在這裏解釋:readarray (or pipe) issue

+2

Woot,你擊中了[Bash Pitfalls](http://mywiki.wooledge.org/BashPitfalls)列表中的#1。 – ghoti

+0

@ ghoti,修好了!謝謝。 –

+0

哇,這工作完美,唯一缺少的是標題,任何方式來包括它?你可以請解釋aswll的解決方案嗎?..謝謝 –