偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

開發(fā)者百寶箱:使用Bash清理數(shù)據(jù)

譯文 精選
系統(tǒng) Linux
本文不僅會(huì)介紹相關(guān)命令,還逐步介紹了每個(gè)步驟背后的思考過程,解釋了我們?yōu)槭裁词褂锰囟钜约八鼈內(nèi)绾螀f(xié)同工作以解決常見的數(shù)據(jù)清理問題。

譯者 | 布加迪

審校 | 重樓

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

今天,我們將學(xué)習(xí)如何使用Bash清理數(shù)據(jù),這是處理數(shù)據(jù)的任何人必備的一項(xiàng)技能。雖然我們?cè)S多人在處理數(shù)據(jù)時(shí)會(huì)使用PythonR,但也可以使用Bash快速高效地處理數(shù)據(jù),可直接從命令行進(jìn)行處理。

本文不僅會(huì)介紹相關(guān)命令,還逐步介紹了每個(gè)步驟背后的思考過程,解釋我們?yōu)槭裁词褂锰囟钜约八鼈內(nèi)绾螀f(xié)同工作解決常見的數(shù)據(jù)清理問題。

讓我們開始吧!

了解數(shù)據(jù)清理過程

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

  • 處理缺失值
  • 修復(fù)格式問題
  • 刪除重復(fù)數(shù)據(jù)
  • 標(biāo)準(zhǔn)化不一致的數(shù)據(jù)
  • 依據(jù)業(yè)務(wù)規(guī)則驗(yàn)證數(shù)據(jù)

因此,干凈的數(shù)據(jù)對(duì)于準(zhǔn)確的分析和可靠的結(jié)果至關(guān)重要。垃圾進(jìn)、垃圾出”這個(gè)原則非常適用于數(shù)據(jù)科學(xué)(這并不奇怪!)。

我們?cè)?/span>本教程中將使用一個(gè)示例數(shù)據(jù)集users.csv 文件。

了解的數(shù)據(jù)

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

要查看文件的內(nèi)容,可以使用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

對(duì)于大型文件,這可能不切實(shí)際,于是我們有其他選擇。

head 命令默認(rèn)顯示文件的前10 行。這對(duì)于快速檢查數(shù)據(jù)的結(jié)構(gòu)和標(biāo)題非常有用。

$ head users.csv

可以使用-n選項(xiàng)指定不同的行數(shù)。

$ head -n 5 users.csv

結(jié)果如下:

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默認(rèn)顯示文件的最后10行。這有助于檢查日志文件或時(shí)間序列數(shù)據(jù)中的最新條目。

帶有-l標(biāo)志的wc(字?jǐn)?shù)統(tǒng)計(jì))命令可以統(tǒng)計(jì)文件中的行數(shù)。這可以讓快速了解數(shù)據(jù)集的大小。

$ wc -l users.csv

輸出結(jié)果:

11 users.csv

可以使用以下命令查看文件結(jié)構(gòu):

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

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

  • column 將輸出格式化為列。
  • -t 指示它創(chuàng)建表格。
  • -s 指定逗號(hào)為分隔符。
  • less -S允許滾動(dòng)瀏覽輸出而不換行

這為提供了格式良好的數(shù)據(jù)視圖,從而容易發(fā)現(xiàn)不一致的地方。

查找和分析數(shù)據(jù)中的問題

我們對(duì)數(shù)據(jù)有了一番基本的了解,不妨識(shí)別具體的問題。

命令使用grep搜索連續(xù)的逗號(hào)(表示空字段),并使用-c來計(jì)數(shù)出現(xiàn)的次數(shù)。

$ grep -c ",," users.csv

這為我們提供了一種快速統(tǒng)計(jì)缺失值行的方法。

2

grep添加-n 標(biāo)志可以顯示行號(hào)以及匹配項(xiàng)幫助我們精確定位缺失值的位置。

$ 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

以下命令識(shí)別日期格式無效的行,具體來說在示例數(shù)據(jù)中查找文本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

不妨查找購買金額為負(fù)數(shù)的記錄:

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

awk 命令可以

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

輸出:

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

使用數(shù)據(jù)清理技術(shù)解決問題

我們已確定了問題所在,現(xiàn)在不妨逐一解決。

處理缺失值

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

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

sed 命令:

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

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

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

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

awk 命令可以

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

更正日期格式

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

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

實(shí)際上,可能需要使用上下文中適用的日期,或者標(biāo)記這些條目供進(jìn)一步查看

處理負(fù)值

可以將負(fù)值替換為零。

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

命令可以

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

組合多個(gè)數(shù)據(jù)清理步驟

實(shí)際上,常需要對(duì)數(shù)據(jù)進(jìn)行多重處理。以下是將它們組合成單個(gè)命令的方法: $ 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

命令的工作原理如下:

  • 根據(jù)每個(gè)字段的特定驗(yàn)證規(guī)則處理它們。
  • 在一次數(shù)據(jù)傳遞中處理多個(gè)問題

這種方法比為每個(gè)問題運(yùn)行單獨(dú)的命令來得更高效,尤其對(duì)于大型數(shù)據(jù)集而言。

驗(yàn)證數(shù)據(jù)清理步驟

清理數(shù)據(jù)后,務(wù)必驗(yàn)證所有問題是否已解決。

檢查是否沒有空字段:

$ 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"

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

檢查所有購買金額是否為非負(fù)數(shù):

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

如果所有購買金額都為非負(fù)數(shù),則返回結(jié)果為空。

轉(zhuǎn)換數(shù)據(jù)

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

提取特定列

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

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

cut命令:

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

當(dāng)只需要特定信息進(jìn)行特定分析時(shí),這非常有用。

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

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

awk命令根據(jù)條件過濾行,創(chuàng)建符合特定條件的數(shù)據(jù)子集。

數(shù)據(jù)排序

我們跳過標(biāo)題行,按姓氏對(duì)記錄進(jìn)行排序。

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

命令:

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

#按購買金額降序排序

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

命令按購買金額降序排序數(shù)據(jù):

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

聚合和分析數(shù)據(jù)

Bash也可用于基本數(shù)據(jù)分析。不妨計(jì)算一下總購買金額

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

awk 命令:

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

現(xiàn)在不妨計(jì)算一下平均購買金額:

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

命令以下方式計(jì)算平均值:

  • 將所有購買金額相加。
  • 計(jì)算記錄數(shù)
  • 總購買金額除以末尾的計(jì)數(shù)
Average purchase: $128.249

接下來,不妨按注冊(cè)月份統(tǒng)計(jì)用戶數(shù)量:

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

這個(gè)更復(fù)雜的awk 命令可以

  • 從注冊(cè)日期中提取月份。
  • 使用關(guān)聯(lián)數(shù)組months統(tǒng)計(jì)出現(xiàn)次數(shù)
  • 按月份打印輸出用戶摘要。
Month 01: 10 users

創(chuàng)建用于清理數(shù)據(jù)的 Bash 腳本

創(chuàng)建可重用的Bash腳本以清理數(shù)據(jù)通常很方便。具體操作方法如下:

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

clean_user_data.sh 腳本:

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

逐個(gè)運(yùn)行命令和運(yùn)行腳本都可以實(shí)現(xiàn)相同的目標(biāo),但腳本便于清楚地了解清理過程,并簡化故障排除。

結(jié)語

但愿本教程能為使用Bash清理數(shù)據(jù)提供了堅(jiān)實(shí)的基礎(chǔ)。

關(guān)鍵要點(diǎn):

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

請(qǐng)記住,雖然Bash功能強(qiáng)大,但它只是數(shù)據(jù)工具箱中的一種工具。對(duì)于非常大的數(shù)據(jù)集或更復(fù)雜的轉(zhuǎn)換,可能需要考慮使用Python、R或?qū)S玫腅TL工具。然而對(duì)于許多日常數(shù)據(jù)清理任務(wù)而言,Bash 的效率和效果都出奇地好!

祝清理愉快!

原文標(biāo)題:Data Cleaning with Bash: A Handbook for Developers,作者:Bala Priya C

責(zé)任編輯:姜華 來源: 51CTO
相關(guān)推薦

2015-09-22 15:24:27

SDNDocker

2015-09-22 16:11:41

SDNDocker

2009-10-28 13:54:38

linux安裝顯卡驅(qū)動(dòng)

2009-10-28 09:48:31

VB.NET XmlR

2011-04-13 09:40:27

2009-10-28 12:05:32

linux監(jiān)控技術(shù)

2009-11-05 11:12:21

WCF自宿主

2009-10-28 18:35:10

Linux基礎(chǔ)用戶

2009-10-27 13:14:35

VB.NET窗體應(yīng)用

2009-11-09 11:31:47

WCF消息隊(duì)列

2009-10-28 14:51:33

VB.NET設(shè)計(jì)制作窗

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文件對(duì)象

2009-11-18 18:18:10

PHP Web查詢數(shù)據(jù)

2009-11-16 14:52:16

PHP數(shù)組

2009-11-12 14:18:19

ADO.NET分頁

2016-01-14 14:17:51

密碼管理密碼分析安全工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)