成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開發者百寶箱:使用Bash清理數據

譯文 精選
系統 Linux
本文不僅會介紹相關命令,還逐步介紹了每個步驟背后的思考過程,解釋了我們為什么使用特定命令以及它們如何協同工作以解決常見的數據清理問題。

譯者 | 布加迪

審校 | 重樓

你是否已厭倦了使用臃腫的工具來處理雜亂的數據?本文介紹了如何使用Bash 清理和轉換數據集。

今天,我們將學習如何使用Bash清理數據,這是處理數據的任何人必備的一項技能。雖然我們許多人在處理數據時會使用PythonR,但也可以使用Bash快速高效地處理數據,可直接從命令行進行處理

本文不僅會介紹相關命令,還逐步介紹了每個步驟背后的思考過程,解釋我們為什么使用特定命令以及它們如何協同工作解決常見的數據清理問題。

讓我們開始吧

了解數據清理過程

在深入探討代碼之前,不妨先了解一下數據清理的實際含義。數據清理指將雜亂的原始數據轉化準確、完整、隨時可供分析的數據。這包括:

  • 處理缺失值
  • 修復格式問題
  • 刪除重復數據
  • 標準化不一致的數據
  • 依據業務規則驗證數據

因此,干凈的數據對于準確的分析和可靠的結果至關重要。垃圾進垃圾出”這個原則非常適用于數據科學(這并不奇怪)。

我們在本教程中將使用一個示例數據集users.csv 文件

了解的數據

在進行任何更改之前,了解在處理的數據很重要。不妨探究一些基本的檢查命令。

要查看文件的內容,可以使用cat 命令。

$ cat users.csv

輸出:

1,John,Smith,john.smith@example.com,2023-01-15,2023-03-20,125.99
2,Jane,Doe,jane.doe@example.com,2023-01-16,2023-03-21,210.50
3,Bob,Johnson,bob@example.com,2023-01-17,2023-03-22,0
4,Alice,Williams,alice.williams@example.com,2023-01-18,,75.25
5,,Brown,mike.brown@example.com,2023-01-19,2023-03-24,150.75
6,Sarah,Miller,sarah.miller@example.com,invalid_date,2023-03-25,95.00
7,David,Jones,david.jones@example.com,2023-01-21,2023-03-26,300.00
8,Lisa,Garcia,lisa.garcia@example.com,2023-01-22,2023-03-27,-50.00
9,James,Martinez,mymail@example.com,2023-01-23,2023-03-28,125.00

對于大型文件,這可能不切實際,于是我們有其他選擇。

head 命令默認顯示文件的前10 行。這對于快速檢查數據的結構和標題非常有用。

$ head users.csv

可以使用-n選項指定不同的行數。

$ head -n 5 users.csv

結果如下:

id,first_name,last_name,email,signup_date,last_login,purchase_amount
1,John,Smith,john.smith@example.com,2023-01-15,2023-03-20,125.99
2,Jane,Doe,jane.doe@example.com,2023-01-16,2023-03-21,210.50
3,Bob,Johnson,bob@example.com,2023-01-17,2023-03-22,0
4,Alice,Williams,alice.williams@example.com,2023-01-18,,75.25

同樣,tail默認顯示文件的最后10行。這有助于檢查日志文件或時間序列數據中的最新條目。

帶有-l標志的wc(字數統計)命令可以統計文件中的行數。這可以讓快速了解數據集的大小。

$ wc -l users.csv

輸出結果:

11 users.csv

可以使用以下命令查看文件結構:

$ column -t -s, users.csv | less -S

命令對于CSV文件尤其有用。下面不妨細述一下:

  • column 將輸出格式化為列
  • -t 指示它創建表格
  • -s 指定逗號為分隔符
  • less -S允許滾動瀏覽輸出而不換行

這為提供了格式良好的數據視圖,從而容易發現不一致的地方

查找和分析數據中的問題

我們對數據有了一番基本的了解,不妨識別具體的問題。

命令使用grep搜索連續的逗號(表示空字段),并使用-c來計數出現的次數。

$ grep -c ",," users.csv

這為我們提供了一種快速統計缺失值行的方法。

2

grep添加-n 標志可以顯示行號以及匹配項幫助我們精確定位缺失值的位置。

$ grep -n ",," users.csv

輸出:

5:4,Alice,Williams,alice.williams@example.com,2023-01-18,,75.25
6:5,,Brown,mike.brown@example.com,2023-01-19,2023-03-24,150.75

以下命令識別日期格式無效的行,具體來說在示例數據中查找文本invalid_date

$ grep -v -E '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' users.csv | grep "invalid_date"

輸出:

6,Sarah,Miller,sarah.miller@example.com,invalid_date,2023-03-25,95.00

不妨查找購買金額為負數的記錄:

$ awk -F, '$7 < 0 {print $0}' users.csv

awk 命令可以

  • 使用-F指定逗號為字段分隔符
  • 檢查第7個字段purchase_amount是否小于 0
  • 如果條件成立,打印輸出整行

輸出:

8,Lisa,Garcia,lisa.garcia@example.com,2023-01-22,2023-03-27,-50.00

使用數據清理技術解決問題

我們已確定了問題所在,現在不妨逐一解決

處理缺失值

首先,我們將空字段替換為NULL

$ sed 's/,,/,NULL,/g; s/,$/,NULL/g' users.csv > users_cleaned.csv

sed 命令:

  • 將連續的逗號,,替換為,NULL,,使缺失值顯式顯示
  • 使用s/,$/,NULL/g 處理行尾的尾隨逗號
  • 將結果寫入名為users_cleaned.csv 的新文件

> 運算符將輸出重定向到新文件而不是屏幕。

我們可以用Unknown填充缺失的名字。

$ awk -F, 'BEGIN {OFS=","} {if ($2 == "") $2 = "Unknown"; print}' users.csv > users_cleaned.csv

awk 命令可以

  • 使用-F將輸入字段分隔符設置為逗號
  • 使用BEGIN {OFS=","} 將輸出字段分隔符也設置為逗號
  • 檢查第二個字段first_name是否為空
  • 將空值替換為Unknown”。
  • 打印輸出每一行(無論是否修改)

更正日期格式

sed 命令將文本“invalid_date替換為格式正確的日期。

$ sed 's/invalid_date/2023-01-20/g' users.csv > users_cleaned.csv

實際上,可能需要使用上下文中適用的日期,或者標記這些條目供進一步查看

處理負值

可以將負值替換為零。

$ awk -F, 'BEGIN {OFS=","} {if ($7 < 0) $7 = 0; print}' users.csv > users_cleaned.csv

命令可以

  • 檢查第七個字段purchase_amount是否小于 0
  • 將負值設置為 0
  • 如果原始值不是負數,則保留原始值。

組合多個數據清理步驟

實際上常需要對數據進行多重處理。以下是將它們組合成單個命令的方法: $ awk -F, 'BEGIN {OFS=","} {


# Fix missing first names
 if ($2 == "") $2 = "Unknown";

 # Fix invalid dates
 if ($5 == "invalid_date" || $5 == "") $5 = "2023-01-20";
 if ($6 == "") $6 = "2023-03-23";

 # Fix negative values
 if ($7 < 0) $7 = 0;

 print
}' users.csv > users_cleaned.csv

命令的工作原理如下:

  • 根據每個字段的特定驗證規則處理它們
  • 在一次數據傳遞中處理多個問題

這種方法比為每個問題運行單獨的命令來得更高效,尤其對于大型數據集而言。

驗證數據清理步驟

清理數據后,務必驗證所有問題是否已解決。

檢查是否沒有空字段:

$ grep -c ",," users_cleaned.csv

如果所有空字段都已正確填寫,則返回 0。

接下來,確保所有日期格式正確:

$ grep -v -E '[0-9]{4}-[0-9]{2}-[0-9]{2}' users_cleaned.csv | grep -v "signup_date"

如果所有日期格式正確,則返回結果為空

檢查所有購買金額是否為非負數:

$ awk -F, '$7 < 0 {print $0}' users_cleaned.csv

如果所有購買金額都為非負數,則返回結果為空。

轉換數據

數據清理完成后,可能需要將某些字段轉換不同的格式,或提取特定信息進行分析。

提取特定列

不妨僅提取姓名和郵箱地址(聯系信息):

$ cut -d, -f2,3,4 users_cleaned.csv > users_contact_info.csv

cut命令:

  • 使用-d,指定逗號為分隔符
  • 使用-f2,3,4 提取第 234個字段(first_name、last_name、email)
  • 創建一個僅包含這些列的新文件

只需要特定信息進行特定分析時,這非常有用。

接下來,我們嘗試提取購買金額超過100 美元的用戶。

$ awk -F, '$7 > 100 {print $0}' users_cleaned.csv > users_high_value.csv

awk命令根據條件過濾行,創建符合特定條件的數據子集。

數據排序

我們跳過標題行,按姓氏對記錄進行排序。

$ (head -n 1 users_cleaned.csv && tail -n +2 users_cleaned.csv | sort -t, -k3) > users_sorted_by_name.csv

命令:

  • 使用head -n 1 保留標題行
  • 使用tail -n +2 獲取除標題之外的所有行
  • 使用sort -t, -k3 按第三個字段(last_name)對數據進行排序
  • 將標題和排序后的數據合并到一個新文件中

#按購買金額降序排序

(head -n 1 users_cleaned.csv && tail -n +2 users_cleaned.csv | sort -t, -k7 -n -r) > users_sorted_by_purchase.csv

命令按購買金額降序排序數據:

  • -t,指定逗號為分隔符
  • -k7 按第七個字段(purchase_amount)排序
  • -n 確保按數字排序(非字母順序)
  • -r 按反向(降序)排序

聚合和分析數據

Bash也可用于基本數據分析。不妨計算一下總購買金額

$ awk -F, 'NR>1 {sum += $7} END {print "Total purchases: $" sum}' users_cleaned.csv

awk 命令:

  • 跳過NR>1 的標題行
  • 將第7個字段purchase_amount中的所有值相加
  • 在末尾打印輸出購買金額。
Total purchases: $1282.49

現在不妨計算一下平均購買金額:

$ awk -F, 'NR>1 {sum += $7; count++} END {print "Average purchase: $" sum/count}' users_cleaned.csv

命令以下方式計算平均值:

  • 將所有購買金額相加
  • 計算記錄數
  • 總購買金額除以末尾的計數
Average purchase: $128.249

接下來,不妨按注冊月份統計用戶數量:

$ awk -F, 'NR>1 {
 split($5, date, "-");
 months[date[2]]++;
} 
END {
 for (month in months) {
 print "Month " month ": " months[month] " users"
 }
}' users_cleaned.csv

這個更復雜的awk 命令可以

  • 從注冊日期中提取月份
  • 使用關聯數組months統計出現次數
  • 按月份打印輸出用戶摘要
Month 01: 10 users

創建用于清理數據的 Bash 腳本

創建可重用的Bash腳本以清理數據通常很方便。具體操作方法如下:

  • 將數據清理命令保存到文件中,比如clean_user_data.sh(該腳本包含幾個額外的數據清理步驟)
  • 使用chmod +x clean_user_data.sh 使其可執行
  • 使用./clean_user_data.sh 運行該腳本

clean_user_data.sh 腳本:

  • 分別處理每個清理步驟,但將所有更改寫入同一個輸出文件
  • 包含進度消息以跟蹤執行情況
  • 清理后執行驗證檢查
  • 輕松修改以添加更多清理步驟或更改現有清理步驟
  • 如果存在臨時文件,末尾刪除臨時文件

逐個運行命令和運行腳本都可以實現相同的目標,但腳本便于清楚地了解清理過程,并簡化故障排除。

結語

但愿本教程能為使用Bash清理數據提供了堅實的基礎。

關鍵要點:

  • Bash非常適合快速高效地清理中小型數據集。
  • grep、awk、sed 和sort 等命令的組合提供了一套靈活的工具包。
  • 可以使用Bash 腳本清理數據以及清理過程記入文檔

請記住,雖然Bash功能強大,但它只是數據工具箱中的一種工具。對于非常大的數據集或更復雜的轉換,可能需要考慮使用Python、R或專用的ETL工具。然而對于許多日常數據清理任務而言,Bash 的效率和效果都出奇地好!

祝清理愉快!

原文標題:Data Cleaning with Bash: A Handbook for Developers作者:Bala Priya C

責任編輯:姜華 來源: 51CTO
相關推薦

2015-09-22 15:24:27

SDNDocker

2015-09-22 16:11:41

SDNDocker

2009-10-28 13:54:38

linux安裝顯卡驅動

2009-10-28 12:05:32

linux監控技術

2011-04-13 09:40:27

2009-10-28 09:48:31

VB.NET XmlR

2009-11-05 11:12:21

WCF自宿主

2009-10-28 18:35:10

Linux基礎用戶

2009-10-27 13:14:35

VB.NET窗體應用

2009-11-09 11:31:47

WCF消息隊列

2009-10-28 14:51:33

VB.NET設計制作窗

2009-11-03 16:17:39

ADO.NET Ent

2009-11-03 16:57:34

ADO.NET FAQ

2009-10-27 15:42:04

VB.NET文件對象

2009-11-16 14:52:16

PHP數組

2009-11-12 14:18:19

ADO.NET分頁

2009-11-18 18:18:10

PHP Web查詢數據

2016-01-14 14:17:51

密碼管理密碼分析安全工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲高清视频一区 | 亚洲精品不卡 | 国产精品久久久久久影视 | 色伊人 | 精品一区二区三区中文字幕 | 国产精品一区二区免费 | 在线播放一区二区三区 | 午夜精品在线观看 | 日韩在线一区二区三区 | 成人国产精品久久久 | 亚洲3级 | 日韩色视频 | av在线一区二区三区 | 区一区二在线观看 | 精品av | 91精品国产91久久久久久密臀 | 国产成人免费视频网站视频社区 | 天天爱天天操 | 中文字幕在线观看 | 日韩电影中文字幕 | 亚洲成人免费网址 | 亚洲美女一区 | 国产欧美精品 | 99亚洲精品 | 在线免费观看毛片 | 欧美aⅴ| 亚洲综合一区二区三区 | 国产视频久久久 | 久久久久久久91 | 天天综合永久入口 | jizz中国日本 | 欧美日韩高清免费 | 一区二区三区视频在线 | 欧美精品片 | 黄网站在线播放 | 国产视频精品在线 | 亚洲视频一区二区三区四区 | 日韩精品一区二区三区中文字幕 | 国产精品高潮呻吟久久 | 久久99精品久久久久婷婷 | 国产精品久久午夜夜伦鲁鲁 |