刪除文件第一行記錄妖滔,即字段名稱(chēng)
處理的文件第一行都是字段名稱(chēng)俭尖,我們?cè)谖募械臄?shù)據(jù)導(dǎo)入到數(shù)據(jù)倉(cāng)庫(kù)Hive中時(shí)氢惋,不需要第一行字段名稱(chēng)洞翩,因此,這里在做數(shù)據(jù)預(yù)處理時(shí)焰望,刪除第一行骚亿。
命令說(shuō)明:
sed [-nefr] [動(dòng)作]
選項(xiàng)與參數(shù):
-n :使用安靜(silent)模式。在一般 sed 的用法中熊赖,所有來(lái)自 STDIN 的數(shù)據(jù)一般都會(huì)被列出到終端上来屠。但如果加上 -n 參數(shù)后,則只有經(jīng)過(guò)sed 特殊處理的那一行(或者動(dòng)作)才會(huì)被列出來(lái)震鹉。
-e :直接在命令列模式上進(jìn)行 sed 的動(dòng)作編輯俱笛;
-f :直接將 sed 的動(dòng)作寫(xiě)在一個(gè)文件內(nèi), -f filename 則可以運(yùn)行 filename 內(nèi)的 sed 動(dòng)作足陨;
-r :sed 的動(dòng)作支持的是延伸型正規(guī)表示法的語(yǔ)法嫂粟。(默認(rèn)是基礎(chǔ)正規(guī)表示法語(yǔ)法)
-i :直接修改讀取的文件內(nèi)容,而不是輸出到終端墨缘。
操作:
sed -i '1d' xxxx.csv
查看:
head -5 xxxx.csv
sed 還可以幫我們做更多星虹,替換操作等。
對(duì)字段進(jìn)行預(yù)處理
對(duì)數(shù)據(jù)集進(jìn)行一些預(yù)處理镊讼,包括為每行記錄增加一個(gè)id字段(讓記錄具有唯一性)宽涌、增加一個(gè)省份字段(用來(lái)后續(xù)進(jìn)行可視化分析),并且丟棄一個(gè)字段(后面分析不需要這個(gè)字段)蝶棋。
下面我們要建一個(gè)腳本文件(xxx.sh):
#!/bin/bash
#下面設(shè)置輸入文件卸亮,把用戶(hù)執(zhí)行xxx.sh命令時(shí)提供的第一個(gè)參數(shù)作為輸入文件名稱(chēng)
infile=$1
#下面設(shè)置輸出文件,把用戶(hù)執(zhí)行xxx.sh命令時(shí)提供的第二個(gè)參數(shù)作為輸出文件名稱(chēng)
outfile=$2
#注意M嫒埂兼贸!最后的$infile > $outfile必須跟在}’這兩個(gè)字符的后面
awk -F "," 'BEGIN{
srand();
id=0;
Province[0]="山東";Province[1]="山西";Province[2]="河南";Province[3]="河北";Province[4]="陜西";Province[5]="內(nèi)蒙古";Province[6]="上海市";
Province[7]="北京市";Province[8]="重慶市";Province[9]="天津市";Province[10]="福建";Province[11]="廣東";Province[12]="廣西";Province[13]="云南";
Province[14]="浙江";Province[15]="貴州";Province[16]="新疆";Province[17]="西藏";Province[18]="江西";Province[19]="湖南";Province[20]="湖北";
Province[21]="黑龍江";Province[22]="吉林";Province[23]="遼寧"; Province[24]="江蘇";Province[25]="甘肅";Province[26]="青海";Province[27]="四川";
Province[28]="安徽"; Province[29]="寧夏";Province[30]="海南";Province[31]="香港";Province[32]="澳門(mén)";Province[33]="臺(tái)灣";
}
{
id=id+1;
value=int(rand()*34);
print id"\t"$1"\t"$2"\t"$3"\t"$5"\t"substr($6,1,10)"\t"Province[value]
}' $infile > $outfile
上面的代碼的基本形式是:
awk -F "," '處理邏輯' $infile > $outfile
使用awk可以逐行讀取輸入文件,并對(duì)逐行進(jìn)行相應(yīng)操作吃溅。
其中溶诞,-F參數(shù)用于指出每行記錄的不同字段之間用什么字符進(jìn)行分割,這里是用逗號(hào)進(jìn)行分割决侈。處理邏輯代碼需要用兩個(gè)英文單引號(hào)引起來(lái)螺垢。
$infile是輸入文件的名稱(chēng),我們這里會(huì)輸入infile.csv赖歌,
$outfile表示處理結(jié)束后輸出的文件名稱(chēng)枉圃,我們后面會(huì)使用outfile.txt作為輸出文件名稱(chēng)。
在上面的xxx.sh代碼的處理邏輯部分庐冯,
srand()用于生成隨機(jī)數(shù)的種子孽亲,
id是我們?yōu)閿?shù)據(jù)集新增的一個(gè)字段,它是一個(gè)自增類(lèi)型展父,每條記錄增加1墨林,這樣可以保證每條記錄具有唯一性赁酝。
我們會(huì)為數(shù)據(jù)集新增一個(gè)省份字段,用來(lái)進(jìn)行后面的數(shù)據(jù)可視化分析旭等,為了給每條記錄增加一個(gè)省份字段的值,這里衡载,我們首先用Province[]數(shù)組用來(lái)保存全國(guó)各個(gè)省份信息搔耕,然后,在遍歷數(shù)據(jù)集infile.csv的時(shí)候痰娱,每當(dāng)遍歷到其中一條記錄弃榨,使用value=int(rand()*34)語(yǔ)句隨機(jī)生成一個(gè)0-33的整數(shù),作為Province省份值梨睁,然后從Province[]數(shù)組當(dāng)中獲取省份名稱(chēng)鲸睛,增加到該條記錄中。
substr($6,1,10)這個(gè)語(yǔ)句是為了截取時(shí)間字段time的年月日坡贺,方便后續(xù)存儲(chǔ)為date格式官辈。awk每次遍歷到一條記錄時(shí),每條記錄包含了6個(gè)字段遍坟,其中拳亿,第6個(gè)字段是時(shí)間字段,substr($6,1,10)語(yǔ)句就表示獲取第6個(gè)字段的值愿伴,截取前10個(gè)字符肺魁,第6個(gè)字段是類(lèi)似”2014-12-08 18″這樣的字符串(也就是表示2014年12月8日18時(shí)),substr($6,1,10)截取后隔节,就丟棄了小時(shí)鹅经,只保留了年月日。
另外怎诫,在print id”\t”$1″\t”$2″\t”$3″\t”$5″\t”substr($6,1,10)”\t”P(pán)rovince[value]這行語(yǔ)句中瘾晃,我們丟棄了每行記錄的第4個(gè)字段,所以刽虹,沒(méi)有出現(xiàn)$4酗捌。我們生成后的文件是“\t”進(jìn)行分割,這樣涌哲,后續(xù)我們?nèi)ゲ榭磾?shù)據(jù)的時(shí)候胖缤,效果讓人看上去更舒服,每個(gè)字段在排版的時(shí)候會(huì)對(duì)齊顯示阀圾,如果用逗號(hào)分隔哪廓,顯示效果就比較亂。
最后初烘,保存outfile.sh代碼文件涡真,退出vim編輯器分俯。
運(yùn)行shell文件:
chmod +x ./xxx.sh
./xxx.sh ./infile.csv ./outfile.txt
原文:https://blog.csdn.net/yangang1223/article/details/80625405