使用Bash讀取和處理CSV文件的方法
介紹
我將介紹它,因?yàn)樵谑褂?Linux Bash 腳本讀取簡單的 CSV 文件并對其進(jìn)行處理時(shí),它非常容易編寫。
如何使用 cut 命令
作為讀取 CSV 文件并使用您經(jīng)??吹降?Bash 腳本對其進(jìn)行處理的方法,有一種描述是從標(biāo)準(zhǔn)輸入中逐行讀取 CSV 文件并使用 cut 命令將列存儲(chǔ)在變量中。
hoge.sh 的內(nèi)容
?#!/bin/bash while read line do ? # 保存 $line 行中讀入的CSV文件的一行文本,通過cut命令分列保存在變量中。 ? col1=$(echo ${line} | cut -d , -f 1) ? col2=$(echo ${line} | cut -d , -f 2) ? col3=$(echo ${line} | cut -d , -f 3) ? # 處理內(nèi)容描述在這里 ? # $colX 參考讀入的 CSV 文件的文本 ? echo "col1:$col1 col2:$col2 col3:$col3" done < $1
csv文件的內(nèi)容
$ cat hoge.csv a1,a2,a3 b1,b2,b3 c1,c2,c3 $
以 csv 文件作為參數(shù)執(zhí)行腳本
$ ./hoge.sh hoge.csv col1:a1 col2:a2 col3:a3 col1:b1 col2:b2 col3:b3 col1:c1 col2:c2 col3:c3 $
如何使用 IFS 將列存儲(chǔ)在變量中
通過將分隔符 IFS 的環(huán)境變量更改為,并在 read 命令中設(shè)置多個(gè)變量,可以在不使用 cut 命令的情況下進(jìn)行簡單的描述。
hoge.sh 的內(nèi)容
?#!/bin/bash ?# 將讀取的CSV文件的一行文本分列存儲(chǔ)在多個(gè)變量中 while IFS=, read col1 col2 col3 do ? # 處理內(nèi)容描述在這里 ? # $colX 參考讀入的 CSV 文件的文本 ? echo "col1:$col1 col2:$col2 col3:$col3" done < $1
如何使用 IFS 將列存儲(chǔ)在數(shù)組中(●)
您還可以使用 read 命令的 -a 選項(xiàng)將拆分列存儲(chǔ)在數(shù)組中。
?#!/bin/bash while IFS=, read -a col do ? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}" done < $1
這種方式是最推薦的,因?yàn)樗且粋€(gè)數(shù)組,所以很容易循環(huán)、添加、刪除、處理分列,并且可以靈活的引用和使用變量擴(kuò)展來展示。
#!/bin/bash while IFS=, read -a col do ? for c in ${col[@]} ? do ? ? echo "loop:$c" ? done ? unset col[2] ? col+=(lastcol) ? echo "${col[@]}" ? echo "${col[@]:1}" ? echo "${col[@]/#/col:}" done < $1
$ ./hoge.sh hoge.csv loop:a1 loop:a2 loop:a3 a1 a2 lastcol a2 lastcol col:a1 col:a2 col:lastcol loop:b1 loop:b2 loop:b3 b1 b2 lastcol b2 lastcol col:b1 col:b2 col:lastcol loop:c1 loop:c2 loop:c3 c1 c2 lastcol c2 lastcol col:c1 col:c2 col:lastcol $
對于空格或制表符分隔的文件
如果文件分隔符是空格分隔符(SSV)或制表符分隔符(TSV),則分隔符的環(huán)境變量IFS默認(rèn)為空格、制表符和換行符,因此在腳本中不指定IFS進(jìn)行處理.我可以的。
?#!/bin/bash while read -a col do ? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}" done < $1
但是,如果該列為空,則將省略其前后連續(xù)的空格和制表符,并將變量位置打包在一起。
$ cat hoge.ssv a1 a2 a3 b1 b3 c3 $
$ ./hoge.sh hoge.ssv col1:a1 col2:a2 col3:a3 col1:b1 col2:b3 col3: col1:c3 col2: col3: $
為了防止這種情況,您需要用逗號(hào)替換空格和制表符,并將它們讀入以逗號(hào)分隔的數(shù)組。
?#!/bin/bash IFS=, while read line do ? col=(${line// /,}) ? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}" done < $1
#!/bin/bash IFS=, while read line do ? col=(${line//$'\t'/,}) ? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}" done < $1
如何處理要讀取的CSV文件
如果您想以相反的順序讀取 CSV 文件,替換特定字符,然后讀取它,您可以在讀取 CSV 文件之前對其進(jìn)行處理,方法是將進(jìn)程替換的結(jié)果 <() 傳遞給標(biāo)準(zhǔn)輸入。
?#!/bin/bash while IFS=, read -a col do ? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}" done < <(tac $1)
$ cat hoge.csv a1,a2,a3 b1,b2,b3 c1,c2,c3 $
$ ./hoge.sh hoge.csv col1:c1 col2:c2 col3:c3 col1:b1 col2:b2 col3:b3 col1:a1 col2:a2 col3:a3 $
如何使用awk命令
如果您想輕松處理或聚合 CSV 文件,使用 awk 命令處理它可能會(huì)更簡單。
awk命令從頭開始逐行讀取指定為參數(shù)的文件,自動(dòng)將分隔符分隔的內(nèi)容存儲(chǔ)在變量$1,$2…中,可以逐行描述要處理的內(nèi)容。處理 CSV 文件時(shí),需要在 -F 選項(xiàng)中指定逗號(hào)作為分隔符。
$ awk -F, '{print "col1:"$1,"col2:"$2,"col3:"$3}' hoge.csv col1:a1 col2:a2 col3:a3 col1:b1 col2:b2 col3:b3 col1:c1 col2:c2 col3:c3 $
此外,如果處理內(nèi)容變得復(fù)雜,則可以將處理內(nèi)容描述在文件中作為腳本。
{ print "col1:"$1,"col2:"$2,"col3:"$3 }
$ awk -F, -f hoge.awk hoge.csv col1:a1 col2:a2 col3:a3 col1:b1 col2:b2 col3:b3 col1:c1 col2:c2 col3:c3 $
如果文件分隔符是空格分隔 (SSV) 或制表符分隔 (TSV),則無需像 Bash 腳本那樣指定選項(xiàng)即可讀取,但由于變量位置已打包并存儲(chǔ),因此指定選項(xiàng)更安全。
$ awk -F'[. ]' '{print "col1:"$1,"col2:"$2,"col3:"$3}' hoge.ssv col1:a1 col2:a2 col3:a3 col1:b1 col2: col3:b3 col1: col2: col3:c3 $
$ awk -F'[.\t]' '{print "col1:"$1,"col2:"$2,"col3:"$3}' hoge.tsv col1:a1 col2:a2 col3:a3 col1:b1 col2: col3:b3 col1: col2: col3:c3 $
awk 命令也是一個(gè)功能強(qiáng)大的命令,但是還有一種方法是使用 perl 命令來處理 CSV 文件,這種方法更加直觀和復(fù)雜。
這是一個(gè)非常復(fù)雜的命令,默認(rèn)包含在 Linux 服務(wù)器中,所以如果您有興趣,可以使用它。
到此這篇關(guān)于使用Bash讀取和處理CSV文件的方法的文章就介紹到這了,更多相關(guān)Bash讀取和處理CSV內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shell腳本生成Go的程序包的實(shí)現(xiàn)步驟
通過編寫Shell腳本,我們可以大大簡化Golang項(xiàng)目的打包和部署流程,本文就來介紹一下Shell腳本生成Go的程序包的實(shí)現(xiàn)步驟,感興趣的可以了解一下2024-01-01Shell腳本實(shí)現(xiàn)檢測某ip網(wǎng)絡(luò)暢通情況(含短信報(bào)警功能)
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)檢測某ip網(wǎng)絡(luò)暢通情況(含短信報(bào)警功能),本文腳本針對一個(gè)服務(wù)器IP進(jìn)行檢查,也可改造一下,執(zhí)行個(gè)多個(gè)IP的檢查,需要的朋友可以參考下2014-12-12linux shell中的比較符號(hào)與特殊符號(hào)介紹
本文為大家介紹linux shell中的特殊符號(hào),包括字符串比較、數(shù)字比較與計(jì)算、特殊字符等,學(xué)習(xí)shell的朋友可以看下2013-06-06Linux 查看內(nèi)存插槽數(shù)、最大容量的方法
下面小編就為大家?guī)硪黄狶inux 查看內(nèi)存插槽數(shù)、最大容量的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05Linux中執(zhí)行shell腳本的4種方法總結(jié)
這篇文章主要介紹了Linux中執(zhí)行shell腳本的4種方法總結(jié),即在Linux中運(yùn)行shell腳本的4種方法,需要的朋友可以參考下2014-08-08Shell腳本實(shí)現(xiàn)啟動(dòng)PHP內(nèi)置FastCGI Server
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)啟動(dòng)PHP內(nèi)置FastCGI Server,本文講解了一些需求過程,并給出了實(shí)現(xiàn)需求的shell腳本,需要的朋友可以參考下2015-04-04linux下自動(dòng)備份MySQL數(shù)據(jù)并上傳到FTP上的shell腳本
linux下自動(dòng)備份MySQL數(shù)據(jù)并上傳到FTP上的shell腳本,需要的朋友可以參考下2013-01-01Shell腳本中不同進(jìn)制數(shù)據(jù)轉(zhuǎn)換的例子(二進(jìn)制、八進(jìn)制、十六進(jìn)制、base64)
這篇文章主要介紹了Shell腳本中不同進(jìn)制數(shù)據(jù)轉(zhuǎn)換的例子(二進(jìn)制、八進(jìn)制、十六進(jìn)制、base64),需要的朋友可以參考下2014-11-11shell腳本內(nèi)調(diào)用另外一個(gè)shell腳本的幾種方法講解
在Linux開發(fā)中經(jīng)常會(huì)編寫shell腳本來執(zhí)行一些任務(wù),下面這篇文章主要給大家介紹了關(guān)于shell腳本內(nèi)調(diào)用另外一個(gè)shell腳本的幾種方法,需要的朋友可以參考下2023-06-06Linux Shell 生成隨機(jī)數(shù)和隨機(jī)字符串的方法示例
這篇文章主要介紹了Linux Shell 生成隨機(jī)數(shù)和隨機(jī)字符串的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02