shell script 處理 CSV 文件(Excel)

CSV 是一種非常方便的數(shù)據(jù)交換格式风喇。業(yè)務(wù)人員可以方便的在 Excel 進(jìn)行編輯,然后上傳到業(yè)務(wù)系統(tǒng)中。但是對(duì)于 Developer朴读,Excel 略顯笨重,并且編程方便并不那么友好走趋。

本文將介紹一種方式衅金,在 shell script 中處理 CSV 文件。內(nèi)容涉及:

  • 提取數(shù)據(jù)行
  • 統(tǒng)計(jì)行數(shù)
  • 輸出指定列
  • 按列排序
  • 比較兩列數(shù)據(jù)

其中將使用如下指令:

  • cat
  • grep
  • awk
  • wc
  • sort
  • vimdiff

提取數(shù)據(jù)行

中國城市近 4 年房產(chǎn)價(jià)格:

City,2013,2014,2015,2016
Beijing,22000,30000,35000,38000
Shanghai,20000,25000,30000,35000
Shaanxi-xi'an,6000,5800,5700,6000
Shaanxi-baoji,1000,1200,2000,2000

提取 Shaanxi 價(jià)格

cat apartment_prices.csv | grep ^Shaanxi
# output
# Shaanxi-xi'an,6000,5800,5700,6000
# Shaanxi-baoji,1000,1200,2000,2000

提取非 Shaanxi 價(jià)格

cat apartment_prices.csv | grep -v ^Shaanxi
# output
# City,2013,2014,2015,2016
# Beijing,22000,30000,35000,38000
# Shanghai,20000,25000,30000,35000

cat 用于輸出 apartment_prices.csv 文件內(nèi)容簿煌,grep 用于按照正則過濾我們需要的文件氮唯。

  • grep ^Shaanxi:提取以 Shaanxi 開頭的數(shù)據(jù)行,^ 在 Regex 中用于指定行首姨伟。
  • grep -v ^Shaanxi-v 參數(shù)為 --invert-match惩琉,提取不滿足 Regex 條件的數(shù)據(jù)。

統(tǒng)計(jì)行數(shù)

中國城市近 4 年房產(chǎn)價(jià)格:

City,2013,2014,2015,2016
Beijing,22000,30000,35000,38000
Shanghai,20000,25000,30000,35000
Shaanxi-xi'an,6000,5800,5700,6000
Shaanxi-baoji,1000,1200,2000,2000

總數(shù)據(jù)行:

cat apartment_prices.csv | wc -l
# 5
  • wc -lwc(Word Count) 用于行數(shù)授滓,字?jǐn)?shù)等數(shù)據(jù)統(tǒng)計(jì)琳水,-l 代表按行數(shù)統(tǒng)計(jì)。

數(shù)據(jù)行數(shù)(沒有header)

cat apartment_prices.csv | tail -n +2 
# Beijing,22000,30000,35000,38000
# Shanghai,20000,25000,30000,35000
# Shaanxi-xi'an,6000,5800,5700,6000
# Shaanxi-baoji,1000,1200,2000,2000

cat apartment_prices.csv | tail -n +2 | wc -l
# 4
  • tail -n +2tail 用于從文件尾部讀取數(shù)據(jù)般堆,-n +2 指定從第二行讀取到行尾在孝。我們常用 tail -f logfile.log 來監(jiān)控 log 輸出。

Shaanxi數(shù)據(jù)量:

cat apartment_prices.csv | grep ^Shaanxi | wc -l
# 2

輸出指定列

中國城市近 4 年房產(chǎn)價(jià)格:

City,2013,2014,2015,2016
Beijing,22000,30000,35000,38000
Shanghai,20000,25000,30000,35000
Shaanxi-xi'an,6000,5800,5700,6000
Shaanxi-baoji,1000,1200,2000,2000

輸出 2014 年的數(shù)據(jù):

cat apartment_prices.csv | awk -F, '{ print $3; }'
  • awk -F, '{ print $3; }'awk 是 linux 中非常強(qiáng)大的列表處理工具淮摔,linux 系統(tǒng)中的幾乎所有輸出都可以用 awk 處理私沮。
    • -F,:指定列分隔符為 ',' (CSV格式),默認(rèn)為空格和橙,制表符仔燕。
    • pring $3: 輸出 第3列 數(shù)據(jù)造垛。

output:

# 2014
# 30000
# 25000
# 5800
# 1200
# 輸出前 3 列
cat apartment_prices.csv | awk -F, '{ print $1","$2","$3; }'

output:

City,2013,2014
Beijing,22000,30000
Shanghai,20000,25000
Shaanxi-xi'an,6000,5800
Shaanxi-baoji,1000,1200

按列排序

中國城市近 4 年房產(chǎn)價(jià)格:

City,2013,2014,2015,2016
Beijing,22000,30000,35000,38000
Shanghai,20000,25000,30000,35000
Shaanxi-xi'an,6000,5800,5700,6000

排序 2014 年數(shù)據(jù):

# 僅輸出數(shù)據(jù) 2014 的數(shù)據(jù)
cat apartment_prices.csv | tail -n +2 | awk -F, '{ print $3 }' | sort -g
  • sort -gsort 用于排序數(shù)據(jù),默認(rèn)按照數(shù)據(jù)長度排序晰搀,-g 指定按照數(shù)字值排序五辽。

output:

1200
5800
25000
30000
# 輸出 city 信息
cat apartment_prices.csv | tail -n +2 | awk -F, '{ print $1 "," $3 }' | sort -t ',' -k 2 -g
  • sort -t ',' -k 2 -g-k 2 指定按照第二列排序,-t , 指定列分隔符外恕。

output:

Shaanxi-baoji,1200
Shaanxi-xi'an,5800
Shanghai,25000
Beijing,30000

比較兩列數(shù)據(jù)

比較數(shù)據(jù)需要將數(shù)據(jù)輸出到文件杆逗,然后使用git diff 或者 vim -d file1 file2 來比較。

比如比較 2014 和 2015 的數(shù)據(jù)

# 1. 提取 2014 年的數(shù)據(jù)
cat apartment_prices.csv | tail -n +2 | awk -F, '{ print $4; }' > 2014
# 2. 提取 2015 年的數(shù)據(jù)
cat apartment_prices.csv | tail -n +2 | awk -F, '{ print $5; }' > 2015
# 3. git diff 2014 2015
git diff 2014 2015

output diff:

diff --git a/2014 b/2015
index 162645c..6accdc5 100644
--- a/2014
+++ b/2015
@@ -1,4 +1,4 @@
+38000
 35000
-30000
-5700
+6000
 2000

實(shí)戰(zhàn)應(yīng)用

最近業(yè)務(wù)人員需要更新產(chǎn)品的數(shù)據(jù)鳞疲,通常情況罪郊,業(yè)務(wù)人員使用 Excel 做好產(chǎn)品數(shù)據(jù),然后使用 CSV 格式導(dǎo)入到系統(tǒng)中尚洽。但是由于遺留系統(tǒng)的原因悔橄,CSV數(shù)據(jù)需要導(dǎo)入到不同的系統(tǒng)中。遺留系統(tǒng)的數(shù)據(jù)同步需要 Developer 手動(dòng)進(jìn)行腺毫。

在整個(gè)數(shù)據(jù)同步過程中癣疟,涉及數(shù)據(jù)提取,比較拴曲,校驗(yàn)等過程争舞。由于 Excel 對(duì)于 Developer 并不那么友好,因此用到了本文中的處理方法澈灼,使用 shell script 處理 CSV 文件竞川。

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叁熔,隨后出現(xiàn)的幾起案子委乌,更是在濱河造成了極大的恐慌,老刑警劉巖荣回,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遭贸,死亡現(xiàn)場離奇詭異,居然都是意外死亡心软,警方通過查閱死者的電腦和手機(jī)壕吹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來删铃,“玉大人耳贬,你說我怎么就攤上這事×匝洌” “怎么了咒劲?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我腐魂,道長帐偎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任蛔屹,我火速辦了婚禮削樊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘判导。我一直安慰自己嫉父,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布眼刃。 她就那樣靜靜地躺著,像睡著了一般摇肌。 火紅的嫁衣襯著肌膚如雪擂红。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天围小,我揣著相機(jī)與錄音昵骤,去河邊找鬼。 笑死肯适,一個(gè)胖子當(dāng)著我的面吹牛变秦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播框舔,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蹦玫,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了刘绣?” 一聲冷哼從身側(cè)響起樱溉,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纬凤,沒想到半個(gè)月后福贞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡停士,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年挖帘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恋技。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拇舀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猖任,到底是詐尸還是另有隱情你稚,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站刁赖,受9級(jí)特大地震影響搁痛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宇弛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一鸡典、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枪芒,春花似錦彻况、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抽碌,卻和暖如春悍赢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背货徙。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工左权, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痴颊。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓赏迟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蠢棱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锌杀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,168評(píng)論 2 33
  • 1.創(chuàng)建文件夾 !/bin/sh mkdir -m 777 "%%1" 2.創(chuàng)建文件 !/bin/sh touch...
    BigJeffWang閱讀 10,063評(píng)論 3 53
  • 基礎(chǔ) 1. 學(xué)習(xí)基礎(chǔ)的bash用法,具體地說裳扯,閱讀bash的man手冊(cè)(man bash 并通讀一遍)抛丽;很簡...
    Leon_Geo閱讀 1,115評(píng)論 1 19
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)饰豺,斷路器亿鲜,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 第1章 小試牛刀 $ 是普通用戶,# 表示管理員用戶 root冤吨。 shebang:#!蒿柳。sharp / hash ...
    巴喬書摘閱讀 6,341評(píng)論 1 4