bash處理csv檔

由於asterisk的CDR是csv格式,想要分析特定欄位,如帳單秒數,我們可以使用底下的指令

cat Master.csv|cut -d, -f14

上面那行指令的意思是列出第14個欄位
若想要指定日期範圍的話,可增加一些指令

egrep “2015-08″ Master.csv|cut -d, -f14
上面是指定2015年08月份的資料,只顯示第14個欄位

原本以為這樣就可以了,可是後來發現不夠,因為凡事總有例外,底下的內容就是例外:

"this, is the first entry", this is the second, 34.5
"Dial","SIP/a2/886980xxxxxx,60,XxWw","2015-09-03 14:04:23"

有沒有看到上面那兩行的例子,都是在兩個 " 引號的中間有逗號,這就使我們單純的使用 cut 這個工具按 , 逗號來算第幾個欄位會出錯,因為算出來的欄位數是不一樣的,所以我們就需要專門處理csv的工具,它能把兩個引號中間的逗號給忽略掉。

所以我們要先安裝csvtool這個套件
aptitude install csvtool
用法簡介:
csvtool col 14 Master.csv
上的意思是指定顯示第14個欄位,若你想要使用管線搭配其它程式使用的話,那麼檔名你就要改成 – (減號),這樣它就支援stdin(標準輸入)

底下是搭配csvtool套件所寫的script

#!/bin/bash
#1確定檔名
logname=/var/log/asterisk/cdr-csv/$1.csv
#2指定日期範圍
dateRange=$2
#3指定欄位
column=$3
 
#使用說明:本程式後面要帶3個參數,分別用空格隔開
#語法: cdrchk.sh log檔名 指定日期範圍 指定欄位數字
#範例: cdrchk.sh A0000000013 2015-08 14
 
#日期範圍說明:一定要填,可指定年月日,語法: 年-月-日 ,若只想指定年月,語法:年-月
#若不想指定範圍則需填入 .*
 
if [ "${1}" == "" -o "${1}" == "help" -o "${1}" == "h" ] ;then
echo 使用說明:本程式後面要帶3個參數,分別用空格隔開
echo "語法: cdrchk.sh log檔名 指定日期範圍 指定欄位數字"
echo "範例: cdrchk.sh A0000000013 2015-08 14"
echo "日期範圍說明:一定要填,可指定年月日,語法1:年-月-日 語法2:年-月"
echo "若不想指定日期範圍則需填入 .*"
exit
fi
#egrep "$dateRange" $logname | cut -d, -f$column
egrep "$dateRange" $logname | csvtool col $column -

簡介:此程式後面要帶3個參數,若不帶任何參數的話,則會顯示使用說明,若帶 help 參數也會顯示使用說明。

本篇發表於 bash, voip。將永久鏈結加入書籤。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *