shell脚本读取csv_shell script 处理 CSV 文件(Excel)
CSV 是一種非常方便的數據交換格式。業務人員可以方便的在 Excel 進行編輯,然后上傳到業務系統中。但是對于 Developer,Excel 略顯笨重,并且編程方便并不那么友好。
本文將介紹一種方式,在 shell script 中處理 CSV 文件。內容涉及:
提取數據行
統計行數
輸出指定列
按列排序
比較兩列數據
其中將使用如下指令:
cat
grep
awk
wc
sort
vimdiff
提取數據行
中國城市近 4 年房產價格:
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 價格
cat apartment_prices.csv | grep ^Shaanxi
# output
# Shaanxi-xi'an,6000,5800,5700,6000
# Shaanxi-baoji,1000,1200,2000,2000
提取非 Shaanxi 價格
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 文件內容,grep 用于按照正則過濾我們需要的文件。
grep ^Shaanxi:提取以 Shaanxi 開頭的數據行,^ 在 Regex 中用于指定行首。
grep -v ^Shaanxi:-v 參數為 --invert-match,提取不滿足 Regex 條件的數據。
統計行數
中國城市近 4 年房產價格:
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
總數據行:
cat apartment_prices.csv | wc -l
# 5
wc -l:wc(Word Count) 用于行數,字數等數據統計,-l 代表按行數統計。
數據行數(沒有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 +2: tail 用于從文件尾部讀取數據,-n +2 指定從第二行讀取到行尾。我們常用 tail -f logfile.log 來監控 log 輸出。
Shaanxi數據量:
cat apartment_prices.csv | grep ^Shaanxi | wc -l
# 2
輸出指定列
中國城市近 4 年房產價格:
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 年的數據:
cat apartment_prices.csv | awk -F, '{ print $3; }'
awk -F, '{ print $3; }':awk 是 linux 中非常強大的列表處理工具,linux 系統中的幾乎所有輸出都可以用 awk 處理。
-F,:指定列分隔符為 ',' (CSV格式),默認為空格,制表符。
pring $3: 輸出 第3列 數據。
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 年房產價格:
City,2013,2014,2015,2016
Beijing,22000,30000,35000,38000
Shanghai,20000,25000,30000,35000
Shaanxi-xi'an,6000,5800,5700,6000
排序 2014 年數據:
# 僅輸出數據 2014 的數據
cat apartment_prices.csv | tail -n +2 | awk -F, '{ print $3 }' | sort -g
sort -g:sort 用于排序數據,默認按照數據長度排序,-g 指定按照數字值排序。
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
比較兩列數據
比較數據需要將數據輸出到文件,然后使用git diff 或者 vim -d file1 file2 來比較。
比如比較 2014 和 2015 的數據
# 1. 提取 2014 年的數據
cat apartment_prices.csv | tail -n +2 | awk -F, '{ print $4; }' > 2014
# 2. 提取 2015 年的數據
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
實戰應用
最近業務人員需要更新產品的數據,通常情況,業務人員使用 Excel 做好產品數據,然后使用 CSV 格式導入到系統中。但是由于遺留系統的原因,CSV數據需要導入到不同的系統中。遺留系統的數據同步需要 Developer 手動進行。
在整個數據同步過程中,涉及數據提取,比較,校驗等過程。由于 Excel 對于 Developer 并不那么友好,因此用到了本文中的處理方法,使用 shell script 處理 CSV 文件。
參考資料
總結
以上是生活随笔為你收集整理的shell脚本读取csv_shell script 处理 CSV 文件(Excel)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elasticsearch最大节点数_E
- 下一篇: ddd架构 无法重构_漫谈分层架构:为什