平時一些資料交流,比如,各地保險行業協會與保險公司之間,很大一部分都是通過文本方式的,
因為這種方式非常靈活,打個包,非常易於後期處理!而如果給你一個mdb,或者xls畢竟就沒那麼容易搞定了,
這些資料有時候可能都是幾百萬條記錄,你能想像xls要怎麼做嗎?而且,你要把這些資料匯入你的資料庫,
那你不得不為你這個再開發一個程式,多不划算啊!
可能你也會想如果是文本不需要開發嗎?也許,習慣win平台的我們馬上想起了UE,
無敵列編輯模式(ALT+C),但是,碰到那種欄位長度並不完全相同的情況是不是只能想死呢?
其實呢,藉助強大的SHELL,我們根本無需開發什麼,我們只是寫點簡單的指令碼,同樣可以零活到家。
下面這個是真實案例,為資料的安全性,我對原資料稍微做了處理!
我們先看一下從行業協會過來的資料(下載)的基本結構
$ tail tp_claim.txt
XXXX02|,|7802410222009000261|,|80XXXX020000000000115156175N|,|6802410222009000039A|,|23XXXX0290000000000100915307E|,|84XXXX020000000000116295906E
XXXX02|,|7802410222009000263|,|80XXXX020000000000115170337N|,|6802410222009000126|,|23XXXX0290000000000100918119E|,|
從資料來看,總共有6個欄位,並以分割符”|,|”,並且第六個欄位有可能為空白
這裡簡單的介紹一下目標,我們會以第二列為主鍵,更新某張表的兩個欄位,分別為第三列,和第六例
很明顯 ,這種情況下用強大的AWK明顯是最合適的,先看一下指令碼
awk指令碼
#!/bin/awk -f
BEGIN{
#FS="|,|";
}
{
printf "update t_upd_bj_buss_claim set claim_code='%s',c_state='1'",$2;
printf " where c_comm_typ = '0' and c_rpt_no = '%s';\n",$3;
if(length($6)!=0)
{
printf "update t_upd_bj_buss_claim set c_clm_cnfrm_cde='%s',c_state='1'",$6;
printf " where c_comm_typ = '2' and c_rpt_no = '%s';\n",$3;
}
print "";
}
END{
#print "exit";
這個指令碼很簡單的,都是在討論如何輸出SQL語句,
用到了AWK的三個函數print、printf和length,看這字面的意思,也不用多解析了,跟C有點像
要注意的是printf不會輸出分行符號,及字串中'%s',格式化字元
第三行中,如果最後一列不為空白,多更新一個欄位,僅此而已
然後,我們執行一下,我們可以先修改一下指令碼為可執行檔,然後列印文本,利用管道技術,將欄位分割符'|'串連,
並將分割符'|,|’用tr命令進行替換,並使用
我們剛才的指令碼進行處理,並將處理結果集輸出為tp_claim.sql
$chmod +x tp_claim.awk
$cat tp_claim.txt|tr '|,|' ' '|./tp_claim.awk > tp_claim.sql
剩下的就是我們用sqlplus執行一下這個指令碼了
SQL> @tp_claim.sql
其實我們上面要寫成一個指令碼,但事實上,如果要求簡單一點,我們甚至只要一條命令就夠了
sed -e 's/|,|/ /g' tp_claim.txt | awk '{print "update t_upd_bj_claim set claim_code=\047$3\047 where c_rpt_no = \047$2\047;"}'
解釋一下,上面用到了同樣無比強大的sed進行替換,s代表替換,將|,|替換為空白格,
我們在vi裡面也經常這麼用,如:
:%s/|,|/ /g
在上上文中,我們使用的是tr命令
並用管道串連起來,其中awk命令中的\047代表單引號,雖然是彆扭了一點,
題外話,想輸出單引號還真是有點麻煩,不知道有沒有誰有更好的辦法
awk ‘BEGIN{print “\047”}'
awk "BEGIN{print \"'\"}"
總結:
shell的文本能力真是無比強大,甚至可以join,
如果各位正在考慮資料交換的格式的時候,還是多多考慮一下TXT吧,這才是王道
少用XML,最重要的是不要用二進位的格式(比如.xls,.mdb等)吧,
當然,大部分人可能是在window下面寫代碼,畢竟是大多數人的選擇,那就裝一個Cygwin,
玩一玩SHELL,給你全新的體驗
Technorati 標籤: shell,linux,導數,awk,資料交換,Cygwin