對(duì)于許多數(shù)據(jù)科學(xué)家來(lái)說(shuō),數(shù)據(jù)操作起始于Pandas或Tidyverse。從理論上看,這個(gè)概念沒(méi)有錯(cuò)。畢竟,這是為什么這些工具首先存在的原因。然而,對(duì)于分隔符轉(zhuǎn)換等簡(jiǎn)單任務(wù)來(lái)說(shuō),這些選項(xiàng)通常可能是過(guò)于重量級(jí)了。有意掌握命令行應(yīng)該在每個(gè)開(kāi)發(fā)人員的技能鏈上,特別是數(shù)據(jù)科學(xué)家。學(xué)習(xí)shell中的來(lái)龍去脈無(wú)可否認(rèn)地會(huì)讓你更高效。除此之外,命令行還在計(jì)算方面有一次偉大的歷史記錄。例如,awk - 一種數(shù)據(jù)驅(qū)動(dòng)的腳本語(yǔ)言。Awk首次出現(xiàn)于1977年,它是在傳奇的K&R一書(shū)中的K,Brian Kernighan的幫助下出現(xiàn)的。在今天,大約50年之后,awk仍然與每年出現(xiàn)的新書(shū)保持相關(guān)聯(lián)! 因此,可以肯定的是,對(duì)命令行技術(shù)的投入不會(huì)很快貶值的。
我們會(huì)談及的內(nèi)容
ICONV
HEAD
TR
WC
SPLIT
SORT & UNIQ
CUT
PASTE
JOIN
GREP
SED
AWK
ICONV
文件編碼總是棘手的問(wèn)題。目前大部分文件都是采用的 UTF-8編碼。要想了解 UTF-8的魔力,可以看看這個(gè)優(yōu)秀的視頻。盡管如此,有時(shí)候我們還是會(huì)收到非 UTF-8編碼的文件。這種情況下就需要嘗試轉(zhuǎn)碼。iconv就是這種狀況下的救世主。
iconv是一個(gè)簡(jiǎn)單的程序,可以輸入某種編碼的文本,然后以另一種編碼輸出。
#Converting-f(from)latin1(ISO-8859-1)#-t(to)standardUTF_8iconv-fISO-8859-1-tUTF-8output.txt
有用的選項(xiàng):
head -n 輸出指定行
head -c 輸出指定的字節(jié)
HEAD
如果你是重度Pandas的用戶,那么你會(huì)對(duì)head很熟悉。通常在處理新數(shù)據(jù)時(shí),我們想要做的第一件事就是了解究竟存在那些東西。這會(huì)引起Panda啟動(dòng),讀取數(shù)據(jù),然后調(diào)用df.head() - 很費(fèi)勁,至少可以說(shuō)。head,不需要任何標(biāo)志,將輸出文件的前10行。head真正的能力在于徹查清除操作。 例如,如果我們想將文件的分隔符從逗號(hào)改變?yōu)?a href="http://www.www27dydycom.cn/tags/pi/" target="_blank">pipe通配符。一個(gè)快速測(cè)試將是:head mydata.csv | sed 's/,/|/g'
#Printsoutfirst10linesheadfilename.csv#Printfirst3lineshead-n3filename.csv
有用的選項(xiàng):
head -n 輸出指定行
head -c 輸出指定的字節(jié)
TR命令
Tr類(lèi)似于翻譯,它是基于文件清理的一個(gè)強(qiáng)大使用的工具。一個(gè)理想的用法是替換文件中的分隔符。
#將文件中的制表符分割轉(zhuǎn)換成逗號(hào)cattab_delimited.txt|tr" "","comma_delimited.csv
Tr的另一個(gè)特性是在你的處理中設(shè)置上所有的[:class:]變量。包括:
[:alnum:]所有字母和數(shù)字[:alpha:]所有字母[:blank:]所有水平空白[:cntrl:]所有控制字符[:digit:]所有數(shù)字[:graph:]所有可打印的字符,不包括空格[:lower:]全部小寫(xiě)字母[:print:]所有可打印的字符,包括空格[:punct:]所有標(biāo)點(diǎn)符號(hào)[:space:]所有的水平或垂直空格[:upper:]全部大寫(xiě)字母[:xdigit:]所有十六進(jìn)制數(shù)字
可以將這些多樣化的變量鏈接在一起,組成一個(gè)強(qiáng)大的程序。下面是一個(gè)基于字?jǐn)?shù)統(tǒng)計(jì)的程序,用來(lái)檢查你的README文件是否使用過(guò)度。
catREADME.md|tr"[:punct:][:space:]
另外一個(gè)例子用于正則表達(dá)式
#將所有的大寫(xiě)字母轉(zhuǎn)換成小寫(xiě)catfilename.csv|tr'[A-Z]''[a-z]'
有用的選項(xiàng):
tr -d刪除字符
tr -s壓縮字符
退格
換頁(yè)
垂直選項(xiàng)卡
NNN八進(jìn)制值為NNN的字符
WC
字?jǐn)?shù)統(tǒng)計(jì)。它的價(jià)值主要體現(xiàn)在使用 -l參數(shù)可以進(jìn)行行數(shù)統(tǒng)計(jì)。
#WillreturnnumberoflinesinCSVwc-lgigantic_comma.csv
個(gè)用這個(gè)工具來(lái)驗(yàn)證各個(gè)命令的輸出實(shí)在方便。因此,如果我們要在文件中轉(zhuǎn)換分隔符,然后運(yùn)行 wc -l,驗(yàn)證總行數(shù)是相同的。如果不同,我們就知道一定是哪里出錯(cuò)了。
常用選項(xiàng):
wc -c打印字節(jié)數(shù)
wc -m打印字符數(shù)
wc -L打印最長(zhǎng)一行的長(zhǎng)度
wc -w打印字?jǐn)?shù)
SPLIT命令
文件大小可以有顯著變化。根據(jù)工作的不同,拆分文件是有益的,就像split?;居梅ㄈ缦拢?/p>
#我們拆分這個(gè)CSV文件,每500行分割為一個(gè)新的文件new_filenamesplit-l500filename.csvnew_filename_#filename.csv#lsoutput#new_filename_aaa#new_filename_aab#new_filename_aac
兩個(gè)地方很奇怪:一個(gè)是命名方式,一個(gè)是缺少擴(kuò)展名。后綴約定可以通過(guò)-d標(biāo)識(shí)來(lái)數(shù)字化。添加文件擴(kuò)展名,你需要執(zhí)行下面這個(gè)find命令。他會(huì)給當(dāng)前文件夾下的所有文件追加.csv后綴,所以需要小心使用。
find.-typef-execmv'{}''{}'.csv;#lsoutput#filename.csv.csv#new_filename_aaa.csv#new_filename_aab.csv#new_filename_aac.csv
有效的選項(xiàng):
split -b按特定字節(jié)大小拆分
split -a生成長(zhǎng)度為N的后綴
split -x使用十六進(jìn)制后綴分割
SORT & UNIQ
前面的命令是顯而易見(jiàn)的:他們按照自己說(shuō)的做。這兩者提供了最重要的一擊(即去重單詞計(jì)數(shù))。這是由于有uniq,它只處理重復(fù)的相鄰行。因此在管道輸出之前進(jìn)行排序。一個(gè)有趣的事情是,sort -u將獲得與sort file.txt | uniq相同的結(jié)果。
Sort確實(shí)對(duì)數(shù)據(jù)科學(xué)家來(lái)說(shuō)是一種很有用的小技巧:能夠根據(jù)特定的列對(duì)整個(gè)CSV進(jìn)行排序。
#SortingaCSVfilebythesecondcolumnalphabeticallysort-t","-k2,2filename.csv#Numericallysort-t","-k2n,2filename.csv#Reverseordersort-t","-k2nr,2filename.csv
這里的-t選項(xiàng)是指定逗號(hào)作為分隔符。通常假設(shè)是空格或制表符。此外,-k標(biāo)志是用來(lái)指定我們的鍵的。它的語(yǔ)法是-km,n,m是起始字段,n是最后一個(gè)字段。
有用的選項(xiàng):
sort -f忽略大小寫(xiě)
sort -r逆序
sort -R 亂序
uniq -c計(jì)算出現(xiàn)次數(shù)
uniq -d只打印重復(fù)行
CUT命令
cut用于刪除列。舉個(gè)栗子,如果我們只想要第一列和第三列。
cut-d,-f1,3filename.csv
選擇除了第一列以外的所有列
cut-d,-f2-filename.csv
與其他的命令組合使用,cut命令作為過(guò)濾器
#打印存在“some_string_value”的第1列和第3列的前10行headfilename.csv|grep"some_string_value"|cut-d,-f1,3
找出第二列中唯一值的數(shù)量。
catfilename.csv|cut-d,-f2|sort|uniq|wc-l#計(jì)算唯一值出現(xiàn)的次數(shù),限制輸出前10個(gè)結(jié)果catfilename.csv|cut-d,-f2|sort|uniq-c|head
PASTE
paste是個(gè)有趣的小命令。如果你想合并兩個(gè)文件,而這兩個(gè)文件的內(nèi)容又正好是有序的,那 paste 就可以這樣做。
#names.txtadamjohnzach#jobs.txtlawyeryoutuberdeveloper#JointhetwointoaCSVpaste-d','names.txtjobs.txt>person_data.txt#Outputadam,lawyerjohn,youtuberzach,developer
關(guān)于更多 SQL_-esque變體,請(qǐng)看下面。
JOIN
Join是一種簡(jiǎn)單的、準(zhǔn)切向的SQL。最大的區(qū)別在于Join將返回所有列,匹配可能只發(fā)生在一個(gè)字段上。默認(rèn)情況下,join將嘗試使用第一列作為匹配鍵。對(duì)于不同的結(jié)果,需要以下語(yǔ)法:
#Jointhefirstfile(-1)bythesecondcolumn#andthesecondfile(-2)bythefirstjoin-t","-12-21first_file.txtsecond_file.txt
標(biāo)準(zhǔn)連接是一個(gè)內(nèi)部連接。然而,外部連接也可以通過(guò)-af滯后來(lái)實(shí)現(xiàn)。另一個(gè)值得注意的是-e標(biāo)志,如果發(fā)現(xiàn)有字段丟失,它可以用來(lái)替換成其他值。
#Outerjoin,replaceblankswithNULLincolumns1and2#-owhichfieldstosubstitute-0iskey,1.1isfirstcolumn,etc...join-t","-12-a1-a2-e'NULL'-o'0,1.1,2.2'first_file.txtsecond_file.txt
雖然它不是最容易使用的命令,但是在絕望的時(shí)刻,它就是唯一可用的措施。
常用的選項(xiàng):
join -a 打印未成對(duì)的行
join -e替換缺失字段
join -j等同于 -1 FIELD -2 FIELD
GREP
全局搜索正則表達(dá)式并輸出,或使用grep;可能是最知名的命令,并且有很好的理由。 Grep具有很強(qiáng)的能力,特別是在大型代碼庫(kù)中查找方法。在數(shù)據(jù)科學(xué)領(lǐng)域,它充當(dāng)了其他命令的改進(jìn)機(jī)制。但其標(biāo)準(zhǔn)用法也很有用。
#遞歸搜索并列出當(dāng)前目錄下包含'word'的所有文件grep-lr'word'.#列出包含word的文件數(shù)目grep-lr'word'.|wc-l
對(duì)包含word/pattern的行數(shù)進(jìn)行計(jì)數(shù)
grep-c'some_value'filename.csv#同樣的功能,但是按照文件名列出當(dāng)前目錄下所有包含該關(guān)鍵詞的文件grep-c'some_value'*
Grep使用or運(yùn)算符-|來(lái)檢索多個(gè)值.
grep"first_value|second_value"filename.csv
有用的選項(xiàng)
alias grep="grep --color=auto" 使grep支持彩色輸出
grep -E 使用擴(kuò)展正則表達(dá)式
grep -w 僅匹配完整單詞
grep -l 打印匹配文件的名稱
grep -v 倒序匹配
大殺器
Sed和Awk是本文兩個(gè)最有用的命令。為了簡(jiǎn)潔,我不會(huì)討論那些令人費(fèi)解的細(xì)節(jié)。相反,我會(huì)討論各種各樣的命令來(lái)證明他們令人印象深刻的實(shí)力。如果你想了解的更多,這本書(shū)就可以。
SED
在內(nèi)核中sed是一個(gè)流編輯器。它擅長(zhǎng)替換,但是也可以用來(lái)重構(gòu)。
最基本的sed命令包含了s/old/new/g。也就是全局搜索舊值,替換新值。沒(méi)有/g 我們的命令可能在第一次出現(xiàn)舊值就會(huì)終止。
為了盡快了解它的能力,我們來(lái)看一個(gè)例子。在這個(gè)情況你會(huì)拿到下面的文件:
balance,name$1,000,john$2,000,jack
我們要做的第一件事就是移除美元符。-i 標(biāo)識(shí)表示就地修改。''就是代表一個(gè)零長(zhǎng)度文件擴(kuò)展,因此重寫(xiě)我們的初始文件。理想情況下,你會(huì)單獨(dú)測(cè)試這些并輸出到一個(gè)新文件。
sed-i'''s/$//g'data.txt#balance,name#1,000,john#2,000,jack
下一步,我們的balance列的逗號(hào)。
sed-i'''s/([0-9]),([0-9])//g'data.txt#balance,name#1000,john#2000,jack
最終,Jack有一天起來(lái)并準(zhǔn)備辭職了。所以,再見(jiàn)吧,我的朋友。
sed-i'''/jack/d'data.txt#balance,name#1000,john
就像你所看到的,sed功能強(qiáng)大,但是樂(lè)趣不止于此。
AWK
最好的放最后。Awk不僅是一個(gè)簡(jiǎn)單的命令:它是一個(gè)成熟的語(yǔ)言。在本文中包含的每一個(gè)命令中,awk目前是最酷的。如果你發(fā)現(xiàn)它令你印象深刻,這有大量的資源- 看這,這,和這。
awk包含的常用案例:
文本處理
格式化文本報(bào)告
執(zhí)行計(jì)算操作
執(zhí)行字符串操作
Awk在其最初雛形可以與grep平行。
awk'/word/'filename.csv
或者多使用一點(diǎn)魔法,讓grep和cut結(jié)合。在這,awk對(duì)所有行通過(guò)word打印了以tab分隔的第三和第四列。-F,只是將分隔符變?yōu)槎禾?hào)。
awk-F,'/word/{print$3" "$4}'filename.csv
Awk具有大量有用的內(nèi)置變量。例如, NF -字段數(shù) - 和NR - 記錄數(shù)。為了獲取文件中這53個(gè)記錄:
awk-F,'NR==53'filename.csv
添加一個(gè)小竅門(mén)可以基于一個(gè)值或者多個(gè)值過(guò)濾。下面的第一個(gè)例子,會(huì)打印這些記錄中第一列為string的行數(shù)和列。
awk-F,'$1=="string"{printNR,$0}'filename.csv#Filterbasedoffofnumericalvalueinsecondcolumnawk-F,'$2==1000{printNR,$0}'filename.csv
多數(shù)值表達(dá)式:
#Printlinenumberandcolumnswherecolumnthreegreater#than2005andcolumnfivelessthanonethousandawk-F,'$3>=2005&&$5<=?1000?{?print?NR,?$0?}?'?filename.csv
計(jì)算第三列之和:
awk-F,'{x+=$3}END{printx}'filename.csv
計(jì)算那些第一列值為“something”的第三列之和。
awk-F,'$1=="something"{x+=$3}END{printx}'filename.csv
獲取文件的行數(shù)列數(shù):
awk-F,'END{printNF,NR}'filename.csv#Prettierversionawk-F,'BEGIN{print"COLUMNS","ROWS"};END{printNF,NR}'filename.csv
打印出現(xiàn)過(guò)兩次的行:
awk-F,'++seen[$0]==2'filename.csv
移除多行:
#Consecutivelinesawk'a!~$0;{a=$0}']#Nonconsecutivelinesawk'!a[$0]++'filename.csv#Moreefficientawk'!($0ina){a[$0];print}
使用內(nèi)置函數(shù)gsub()替換多個(gè)值。
awk'{gsub(/scarlet|ruby|puce/,"red");print}'
這個(gè)awk命令合并了多個(gè)CSV文件,忽略頭并在結(jié)尾追加。
awk'FNR==1&&NR!=1{next;}{print}'*.csv>final_file.csv
需要精簡(jiǎn)一個(gè)大文件?好的,awk可以在sed的幫助下完成這件事。具體來(lái)說(shuō),基于一個(gè)行數(shù),這個(gè)命令將一個(gè)大文件分為多個(gè)小文件。這個(gè)一行文件也會(huì)添加一個(gè)擴(kuò)展名。
sed'1d;$d'filename.csv|awk'NR%NUMBER_OF_LINES==1{x="filename-"++i".csv";}{print>x}'#Example:splittingbig_data.csvintodata_(n).csvevery100,000linessed'1d;$d'big_data.csv|awk'NR%100000==1{x="data_"++i".csv";}{print>x}'
結(jié)束前
命令行擁有無(wú)窮的力量。本文所涵蓋的命令行知識(shí)足以讓你從零基礎(chǔ)到入門(mén)。除了這些已涉及的內(nèi)容外,針對(duì)日常數(shù)據(jù)操作還有需要可考慮的實(shí)用程序。Csvkit,xsv和q是其中三個(gè)值得關(guān)注的。
-
編碼
+關(guān)注
關(guān)注
6文章
969瀏覽量
55781 -
命令行
+關(guān)注
關(guān)注
0文章
81瀏覽量
10574 -
數(shù)據(jù)科學(xué)
+關(guān)注
關(guān)注
0文章
168瀏覽量
10489
原文標(biāo)題:數(shù)據(jù)科學(xué)家需要掌握的幾大命令行騷操作
文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛(ài)好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論